Matlab kmeans聚类非线性可分数据

时间:2016-11-06 22:35:40

标签: matlab k-means

我手上有一个非线性可分的数据。我想在matlab中使用K-means实现对其进行聚类。我想获取每个数据点的集群标签,以便将它们用于另一个分类问题。

问题是k-means没有按预期给出结果。我附上了我获得的集群图。

我预计k-means会像数据看起来那样将簇作为同心圆,但输出是弧。我不明白为什么会这样。

你能否建议我使用任何其他聚类方法来实现我的目标。 My cluster plot

1 个答案:

答案 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.')

result

或更一般地说:使用合适的内核进行k-means聚类,或使用其他算法。