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中的凝聚聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SciPy 的层次凝聚聚类中获取质心?

如何在 Scikit-learn 凝聚聚类中使用 Pearson 相关性作为距离度量

scikit learn 凝聚聚类算法的设置条件

如何在 python Scikit-learn 中获得凝聚聚类“质心”

凝聚法层次聚类之ward linkage method

根据相关性使用 Python 对数据进行聚类