3
我手頭有一個非線性可分數據。我想用matlab中的K-means實現對它進行聚類。我想獲取每個數據點的聚類標籤,以便將它們用於另一個分類問題。Matlab kmeans聚類非線性可分數據
問題是k-means沒有按預期給出結果。我附上了我獲得的聚類圖。
我期望k-means給數據集看成同心圓,但輸出是弧。我不明白爲什麼會發生這種情況。
我手頭有一個非線性可分數據。我想用matlab中的K-means實現對它進行聚類。我想獲取每個數據點的聚類標籤,以便將它們用於另一個分類問題。Matlab kmeans聚類非線性可分數據
問題是k-means沒有按預期給出結果。我附上了我獲得的聚類圖。
我期望k-means給數據集看成同心圓,但輸出是弧。我不明白爲什麼會發生這種情況。
使用算法之前,你應該嘗試瞭解它:什麼是算法的目標,以及它是如何實現它。對於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.')
或更一般地:使用合適的內核對於k-means聚類,或者使用另一種算法。
哇,我沒有想到這一點,謝謝你的答案。我知道k-means使用「mean」作爲度量。那麼,這就是爲什麼該算法被命名爲k-means。但我不明白爲什麼它將數據聚類爲弧線。 – papabiceps