2011-11-04 132 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個索引來確定數據集中的最佳羣集數。