【发布时间】:2017-03-20 05:10:11
【问题描述】:
我手头有一个非线性可分的数据。我想在 matlab 中使用 K-means 实现对其进行聚类。我想为每个数据点获取集群标签,以将它们用于另一个分类问题。
问题是 k-means 没有按预期给出结果。我附上了我获得的集群图。
我希望 k-means 能够将集群作为数据看起来的同心圆,但输出是弧。我不明白为什么会这样。
【问题讨论】:
我手头有一个非线性可分的数据。我想在 matlab 中使用 K-means 实现对其进行聚类。我想为每个数据点获取集群标签,以将它们用于另一个分类问题。
问题是 k-means 没有按预期给出结果。我附上了我获得的集群图。
我希望 k-means 能够将集群作为数据看起来的同心圆,但输出是弧。我不明白为什么会这样。
【问题讨论】:
在使用算法之前,您应该尝试了解它:算法的目标是什么,以及它是如何实现的。对于 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 聚类使用合适的内核,或使用其他算法。
【讨论】: