非线性可分数据的 Matlab kmeans 聚类
Matlab kmeans clustering for non linearly separable data
我手头有一个非线性可分的数据。我想在 matlab 中使用 K-means 实现对其进行聚类。我想获取每个数据点的聚类标签,以将它们用于另一个分类问题。
问题是 k-means 没有给出预期的结果。我附上了我获得的聚类图。
我原以为 k-means 会像数据看起来那样将聚类作为同心圆,但输出是弧形。我不明白为什么会这样。
你能建议我任何其他聚类方法来实现我的目标吗?
在使用算法之前,您应该尝试了解它:算法的目标是什么,它是如何实现的。对于 k-means,Wikipedia 告诉我们以下内容:
k-means clustering aims to partition n observations into k clusters in which each observation belongs to the cluster with the nearest mean
三个同心圆的均值完全相同,因此k-means不适合将它们分开。结果真的是你应该从这里的 k-means 期望的。
现在,如果您知道您的簇总是 是同心圆,您可以简单地将笛卡尔 (x-y) 坐标转换为极坐标,并且仅使用半径 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 均值聚类,或者使用其他算法。
我手头有一个非线性可分的数据。我想在 matlab 中使用 K-means 实现对其进行聚类。我想获取每个数据点的聚类标签,以将它们用于另一个分类问题。
问题是 k-means 没有给出预期的结果。我附上了我获得的聚类图。
我原以为 k-means 会像数据看起来那样将聚类作为同心圆,但输出是弧形。我不明白为什么会这样。
你能建议我任何其他聚类方法来实现我的目标吗?
在使用算法之前,您应该尝试了解它:算法的目标是什么,它是如何实现的。对于 k-means,Wikipedia 告诉我们以下内容:
k-means clustering aims to partition n observations into k clusters in which each observation belongs to the cluster with the nearest mean
三个同心圆的均值完全相同,因此k-means不适合将它们分开。结果真的是你应该从这里的 k-means 期望的。
现在,如果您知道您的簇总是 是同心圆,您可以简单地将笛卡尔 (x-y) 坐标转换为极坐标,并且仅使用半径 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 均值聚类,或者使用其他算法。