Kmeans matlab"在迭代1创建的空簇"错误

Tak*_*Tak 9 matlab cluster-analysis k-means

我正在使用这个脚本使用kmeans matlab函数聚类一组3D点,但我总是得到这个错误"在迭代1创建的空集群".我正在使用的脚本:

[G,C] = kmeans(XX, K, 'distance','sqEuclidean', 'start','sample');
Run Code Online (Sandbox Code Playgroud)

XX可以在此链接XX值中找到,K设置为3因此,如果有人可以请告诉我为什么会发生这种情况.

Amr*_*mro 20

它只是告诉你,在assign-recompute迭代期间,一个簇变空(丢失了所有分配的点).这通常是由于群集初始化不充分,或者数据的固有群集少于您指定的群集.

尝试使用该start选项更改初始化方法.Kmeans提供了四种初始化集群的技术:

  • sample:样本K从数据中随机指向初始簇(默认)
  • uniform:在数据范围内均匀选择K个点
  • cluster:对一个小子集执行初步聚类
  • manual:手动指定初始簇

您还可以尝试emptyaction选项的不同值,它告诉MATLAB当集群变空时该怎么做.

最终,我认为你需要减少集群的数量,即尝试K=2集群.


我尝试将您的数据可视化以获得它的感觉:

load matlab_X.mat
figure('renderer','zbuffer')
line(XX(:,1), XX(:,2), XX(:,3), ...
    'LineStyle','none', 'Marker','.', 'MarkerSize',1)
axis vis3d; view(3); grid on
Run Code Online (Sandbox Code Playgroud)

经过一些手动缩放/平移后,它看起来像一个人的轮廓:

3d_points

你可以看到307200点的数据非常密集和紧凑,这证实了我的怀疑; 数据没有那么多集群.


这是我试过的代码:

>> [IDX,C] = kmeans(XX, 3, 'start','uniform', 'emptyaction','singleton');
>> tabulate(IDX)
  Value    Count   Percent
      1    18023      5.87%
      2    264690     86.16%
      3    24487      7.97%
Run Code Online (Sandbox Code Playgroud)

更重要的是,集群2中的所有点都是重复点([0 0 0]):

>> unique(XX(IDX==2,:),'rows')
ans =
     0     0     0
Run Code Online (Sandbox Code Playgroud)

另外两个群集看起来像:

clr = lines(max(IDX));
for i=1:max(IDX)
line(XX(IDX==i,1), XX(IDX==i,2), XX(IDX==i,3), ...
    'Color',clr(i,:), 'LineStyle','none', 'Marker','.', 'MarkerSize',1)
end
Run Code Online (Sandbox Code Playgroud)

聚集点

如果你先删除重复的点,你可能会得到更好的集群...


此外,您有一些可能会影响群集结果的异常值.在视觉上,我将数据范围缩小到以下间隔,其中包含大部分数据:

>> xlim([-500 100])
>> ylim([-500 100])
>> zlim([900 1500])
Run Code Online (Sandbox Code Playgroud)

这是删除欺骗点(超过250K点)和异常值(大约250个数据点)后的结果,以及K=3(使用该replicates选项的5次运行中最好的)聚类:

XX = unique(XX,'rows');
XX(XX(:,1) < -500 | XX(:,1) > 100, :) = [];
XX(XX(:,2) < -500 | XX(:,2) > 100, :) = [];
XX(XX(:,3) < 900 | XX(:,3) > 1500, :) = [];

[IDX,C] = kmeans(XX, 3, 'replicates',5);
Run Code Online (Sandbox Code Playgroud)

在三个集群中几乎相等的分裂:

>> tabulate(IDX)
  Value    Count   Percent
      1    15605     36.92%
      2    15048     35.60%
      3    11613     27.48%
Run Code Online (Sandbox Code Playgroud)

回想一下,默认距离函数是欧氏距离,它解释了形成的簇的形状.

最终聚类