2011-11-04 95 views
6

我有一个简单的二维数据集,我希望以凝聚的方式聚集(不知道要使用的最佳数量的聚类)。我能够成功地对数据进行聚类的唯一方法是给函数一个'maxclust'值。在Matlab中凝聚聚类

为了简单起见,让我们说这是我的数据集:

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个簇对于这个数据集是最优的,我该如何将这些数据聚类?

感谢

+0

类似的问题:[实践中使用凝聚层次聚类的停止标准是什么?](http://stats.stackexchange.com/q/2597) – Amro

+0

@Amro Nice链接! –

回答

5

此方法的要点是,它代表了一个层次中出现的集群,它是由你来决定你要多少细节,抓..

agglomerative dendogram

可以将此看作具有与树状图相交的水平线,该树从0(每个点是它自己的簇)开始一直移动到最大值(一个簇中的所有点)。你可以:

  • 停止当你到达根据集群,其中相距甚远的簇的预定数量(example
  • 手动地将它给予一定的高度值(example
  • 选择将它到距离标准(即有大的跳跃到一个新的水平)(example

这可以通过使用的该'maxclust''cutoff'参数来完成CLUSTER/CLUSTERDATA函数

+0

很好的解释,Amro。我注意到这是一个你似乎有丰富经验的话题。这些链接对我的应用程序都非常有用。谢谢! –

5

要选择最佳聚类数,一个常用的方法就是让类似碎石图的曲线图。然后你在图中寻找“肘”,那就是你挑选的聚类数量。对于这里的标准,我们将使用中的集群求和的平方:

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 

enter image description here

+0

平方群内聚集总和可能并不总是一个很好的标准,特别是因为层次聚类默认使用单连接方法,根据定义,它只需要分离(群集间)并且不关心紧凑性 或平衡(群集内) – Amro

+0

感谢此代码。与Amro共享的第三个链接中使用的方法相结合时,它特别有用。 –

-1

您可以在R中使用NbClust包,该包使用30个索引来确定数据集中的最佳群集数。