2016-11-06 163 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