11

给定一个包含互相关值的下三角矩阵 (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>
4

3 回答 3

15

这对于层次聚类来说是一个很好的问题。使用完整的链接聚类,您将获得紧凑的聚类,您所要做的就是确定截止距离,在该距离上两个聚类应该被认为是不同的。

首先,您需要将相关矩阵转换为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)

在此处输入图像描述

于 2012-09-02T13:40:04.143 回答
2

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

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

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

dendrogram(Z);

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

于 2016-08-01T22:34:50.487 回答
0

鉴于将有 4 个组,我将从一个非常简单的两阶段方法开始。

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

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

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

于 2012-09-02T12:40:32.947 回答