在Matlab中查找具有高互相关矩阵的组

时间:2012-09-02 07:26:23

标签: matlab cluster-analysis correlation

给出包含互相关的下三角矩阵(100x100) 值',其中条目'ij'是信号'i'之间的相关值 和'j'所以高值意味着这两个信号属于 相同类别的对象,并且知道最多有四个不同的对象 数据集中的类,有人知道一种快速有效的方法 对数据进行分类并将所有信号分配给4种不同的信号 类,而不是搜索和交叉检查所有条目 彼此?以下7x7矩阵可能有助于说明 重点:

 1      0       0       0       0       0       0
.2      1       0       0       0       0       0
.8      .15     1       0       0       0       0
.9      .17     .8      1       0       0       0
.23     .8      .15     .14     1       0       0
.7      .13     .77     .83.    .11     1       0
.1      .21     .19     .11     .17     .16     1

此示例中有三个类:

class 1: rows <1 3 4 6>,
class 2: rows <2 5>,
class 3: rows <7>

3 个答案:

答案 0 :(得分:13)

这是分层聚类的一个很好的问题。使用完整的链接聚类,您将获得紧凑的聚类,您所要做的就是确定截止距离,在此处应将两个聚类视为不同。

首先,您需要将相关矩阵转换为dissimilarity矩阵。由于相关性介于0和1之间,1-correlation将运行良好 - 高相关性得分接近0,低相关性得分接近1.假设相关性存储在数组corrMat

%# remove diagonal elements
corrMat = corrMat - eye(size(corrMat));
%# and convert to a vector (as pdist)
dissimilarity = 1 - corrMat(find(corrMat))';

%# decide on a cutoff
%# remember that 0.4 corresponds to corr of 0.6!
cutoff = 0.5; 

%# perform complete linkage clustering
Z = linkage(dissimilarity,'complete');

%# group the data into clusters
%# (cutoff is at a correlation of 0.5)
groups = cluster(Z,'cutoff',cutoff,'criterion','distance')
groups =
     2
     3
     2
     2
     3
     2
     1

要确认一切都很好,您可以看到树形图

dendrogram(Z,0,'colorthreshold',cutoff)

enter image description here

答案 1 :(得分:2)

您可以使用以下方法,而不是创建相异度矩阵。

Z = linkage(corrMat,'complete','correlation')

这允许Matlab将矩阵解释为相关距离,然后,您可以如下绘制树形图:

dendrogram(Z);

验证树形图是否正确的一种方法是检查其最大高度,该高度应与1-min(corrMat)相对应。如果corrMat中的最小值为0,则树的最大高度应为1.如果最小值为-1(负相关),则高度应为2.

答案 2 :(得分:0)

由于给出了将要有4个小组,我将从一个非常简单的两阶段方法开始。

在第一阶段,您可以找到任意两个元素之间的最大相关性,将这两个元素放在一个组中,然后将它们在矩阵中的相关性归零。重复一遍,找到两个元素之间的下一个最高相关性,并将它们添加到现有组或创建一个新元素,直到您拥有正确数量的组。

最后,检查哪些元素不在一个组中,转到他们的列,并确定他们与任何其他组的最高相关性。如果该元素已经在一个组中,那么也将它们放在该组中,否则跳到下一个元素并稍后返回它们。

如果有兴趣或任何不清楚的地方我可以稍后添加代码。就像我说的那样,这种方法很简单,但如果你不需要验证组的数量,我认为它应该是有效的。