给出包含互相关的下三角矩阵(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>
答案 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)
答案 1 :(得分:2)
您可以使用以下方法,而不是创建相异度矩阵。
Z = linkage(corrMat,'complete','correlation')
这允许Matlab将矩阵解释为相关距离,然后,您可以如下绘制树形图:
dendrogram(Z);
验证树形图是否正确的一种方法是检查其最大高度,该高度应与1-min(corrMat)
相对应。如果corrMat中的最小值为0,则树的最大高度应为1.如果最小值为-1(负相关),则高度应为2.
答案 2 :(得分:0)
由于给出了将要有4个小组,我将从一个非常简单的两阶段方法开始。
在第一阶段,您可以找到任意两个元素之间的最大相关性,将这两个元素放在一个组中,然后将它们在矩阵中的相关性归零。重复一遍,找到两个元素之间的下一个最高相关性,并将它们添加到现有组或创建一个新元素,直到您拥有正确数量的组。
最后,检查哪些元素不在一个组中,转到他们的列,并确定他们与任何其他组的最高相关性。如果该元素已经在一个组中,那么也将它们放在该组中,否则跳到下一个元素并稍后返回它们。
如果有兴趣或任何不清楚的地方我可以稍后添加代码。就像我说的那样,这种方法很简单,但如果你不需要验证组的数量,我认为它应该是有效的。