Matlab中的凝聚聚类
Posted
技术标签:
【中文标题】Matlab中的凝聚聚类【英文标题】:Agglomerative Clustering in Matlab 【发布时间】:2011-12-22 09:53:24 【问题描述】:我有一个简单的二维数据集,我希望以凝聚的方式进行聚类(不知道要使用的最佳聚类数)。我能够成功地对数据进行聚类的唯一方法是给函数一个“maxclust”值。
为简单起见,假设这是我的数据集:
X=[ 1,1;
1,2;
2,2;
2,1;
5,4;
5,5;
6,5;
6,4 ];
当然,我希望这些数据形成 2 个集群。我明白,如果我知道这一点,我只能说:
T = clusterdata(X,'maxclust',2);
要找出哪些点属于每个集群,我可以说:
cluster_1 = X(T==1, :);
和
cluster_2 = X(T==2, :);
但不知道 2 个集群对于这个数据集来说是最佳的,我如何对这些数据进行集群?
谢谢
【问题讨论】:
类似问题:What stop-criteria for agglomerative hierarchical clustering are used in practice? 【参考方案1】:要选择最佳聚类数,一种常见的方法是制作类似于 Scree Plot 的绘图。然后你在图中寻找“肘部”,这就是你选择的集群数量。对于这里的标准,我们将使用簇内平方和:
function wss = plotScree(X, n)
wss = zeros(1, n);
wss(1) = (size(X, 1)-1) * sum(var(X, [], 1));
for i=2:n
T = clusterdata(X,'maxclust',i);
wss(i) = sum((grpstats(T, T, 'numel')-1) .* sum(grpstats(X, T, 'var'), 2));
end
hold on
plot(wss)
plot(wss, '.')
xlabel('Number of clusters')
ylabel('Within-cluster sum-of-squares')
>> plotScree(X, 5)
ans =
54.0000 4.0000 3.3333 2.5000 2.0000
【讨论】:
簇内平方和可能并不总是一个好的标准,特别是因为层次聚类默认使用单链接方法,根据定义,它只需要分离(簇间)和不关心紧凑性或平衡性(集群内) 感谢此代码。与Amro分享的第三个链接中使用的方法结合使用时特别有用。【参考方案2】:这个方法的全部意义在于它代表了在一个层次结构中找到的集群,你可以决定你想得到多少细节。
将其视为与树状图相交的水平线,它从 0(每个点都是自己的簇)一直移动到最大值(一个簇中的所有点)。你可以:
达到预定数量的集群时停止 (example) 根据特定高度值手动定位 (example) 根据距离标准选择将其放置在集群相距太远的地方(即有一个很大的跳跃到下一个级别)(example)这可以通过使用 CLUSTER/CLUSTERDATA 函数的 'maxclust'
或 'cutoff'
参数来完成
【讨论】:
很好的解释,Amro。我注意到这是一个你似乎有丰富经验的话题。这些链接对我的应用程序都非常有用。谢谢!以上是关于Matlab中的凝聚聚类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Scikit-learn 凝聚聚类中使用 Pearson 相关性作为距离度量