我手上有一个非线性可分的数据。我想在matlab中使用K-means实现对其进行聚类。我想获取每个数据点的集群标签,以便将它们用于另一个分类问题。
问题是k-means没有按预期给出结果。我附上了我获得的集群图。
我预计k-means会像数据看起来那样将簇作为同心圆,但输出是弧。我不明白为什么会这样。
答案 0 :(得分:3)
在使用算法之前,您应该尝试理解它:算法的目标是什么,以及它是如何实现的。对于k-means,Wikipedia告诉我们以下内容:
k-means聚类旨在将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聚类,或使用其他算法。