Matlab kmeans聚类用于非线性可分离数据

pap*_*eps 3 matlab k-means

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

问题是k均值未达到预期的结果。我将附加获得的聚类图。

我期望k均值能够像数据看起来那样将聚类赋予同心圆,但是输出是圆弧。我不明白为什么会这样。

您能建议我任何其他的聚类方法来实现我的目标吗? 我的集群图

hba*_*rts 5

在使用算法之前,您应该尝试理解它:算法的目标是什么,以及如何实现它。对于k均值,维基百科告诉我们以下内容:

k均值聚类旨在将n个观察值划分为k个簇,其中每个观察值均属于具有最均值的簇

三个同心圆具有完全相同的均值,因此k均值不适合将它们分开。结果确实是您应该从这里的k均值得到的期望值。

现在,如果您知道群集将始终是同心圆,则只需将笛卡尔(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.')
Run Code Online (Sandbox Code Playgroud)

结果

或更一般而言:使用合适的内核进行k均值聚类,或使用其他算法。