Matlab kmeans聚类非线性可分数据
问题描述:
我手头有一个非线性可分数据。我想用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