2016-11-06 178 views
3

我手頭有一個非線性可分數據。我想用matlab中的K-means實現對它進行聚類。我想獲取每個數據點的聚類標籤,以便將它們用於另一個分類問題。Matlab kmeans聚類非線性可分數據

問題是k-means沒有按預期給出結果。我附上了我獲得的聚類圖。

我期望k-means給數據集看成同心圓,但輸出是弧。我不明白爲什麼會發生這種情況。

你能否建議我使用其他聚類方法來實現我的目標? My cluster plot

回答

3

使用算法之前,你應該嘗試瞭解它:什麼是算法的目標,以及它是如何實現它。對於k-均值,Wikipedia告訴我們以下:

k-均值聚類的目的是劃分n個觀察到k個簇,其中每個觀測屬於集羣與最近的平均

三個同心圓將具有完全相同的均值,所以k-means不適合將它們分開。結果真的是你應該從k-means中期待的。

現在,如果你知道你的集羣將總是是同心圓,你可以簡單地轉換您的笛卡爾(XY)座標到極座標,並且只使用半徑rho用於集羣 - 如你所知,角度theta不要緊:

% Create random data 
[x1,y1] = pol2cart(2*pi*rand(1000,1),rand(1000,1)); 
[x2,y2] = pol2cart(2*pi*rand(1000,1),rand(1000,1)+2); 
[x3,y3] = pol2cart(2*pi*rand(1000,1),rand(1000,1)+4); 
X = [x1,y1; x2,y2; x3,y3]; 

% Transform to polar 
[theta,rho] = cart2pol(X(:,1),X(:,2)); 

% k-means clustering 
idx = kmeans(rho,3); 

% Plot results 
hold on 
plot(X(idx==1,1), X(idx==1,2), 'r.') 
plot(X(idx==2,1), X(idx==2,2), 'g.') 
plot(X(idx==3,1), X(idx==3,2), 'b.') 

result

或更一般地:使用合適的內核對於k-means聚類,或者使用另一種算法。

+0

哇,我沒有想到這一點,謝謝你的答案。我知道k-means使用「mean」作爲度量。那麼,這就是爲什麼該算法被命名爲k-means。但我不明白爲什麼它將數據聚類爲弧線。 – papabiceps