如何创建共识矩阵?

How to create consensus matrix?

我需要创建一个共识矩阵。假设我有一个矩阵 A 如下。

1 1 2 2 3 
1 2 2 2 3
1 1 2 3 3

每一行代表一种聚类方法,每个值代表一个特定的聚类。例如,A(1,1) 表示通过第一个聚类方法,第一个数据示例分配到第一组。通过使用这个矩阵,我需要创建一个矩阵如下

1/3 2/3 0/3 0/3 0/3
2/3 1/3 1/3 1/3 0/3
0/3 1/3 1/3 2/3 0/3
0/3 1/3 2/3 1/3 1/3
0/3 0/3 0/3 0/3 1/3

在这个矩阵C中,C(1,2)是基于矩阵A创建的。更明确地说,第1组中的A(1,1)和A(1,2),还有A(3,1)和A (3,2) 也在第 1 组中。所以,C(1,2)=2/3。对角线固定为1/3.

您可以使用bsxfun来比较列

C=squeeze(sum(bsxfun(@eq, A,permute(A, [1 3 2]))));
C(logical(eye(size(C))))=1;
C = C/3;

您首先将 3x5 矩阵置换为 3x1x5 矩阵,然后使用 bsxfun(@eq, ... 比较原始矩阵的列,然后求和两个元素所在的位置通过使用 sum(...,3) 为您提供 1x5x5 矩阵的不同行相等。现在使用 squeeze 来摆脱单例维度。