这只是告诉你,在重新计算重新计算迭代期间,一个集群变为空(丢失所有分配的点).这通常是由于集群初始化不充分,或者数据的固有集群少于指定的集群.
尝试使用start选项更改初始化方法. Kmeans提供了四种可能的初始化集群的技术:
>样本:样本K从数据中随机分配为初始聚类(默认)
>统一:在数据范围内均匀选择K个点
> cluster:在小子集上执行初步聚类
>手动:手动指定初始集群
另外,您可以尝试使用空动态选项的不同值,它告诉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
经过一些手动放大/平移后,它看起来像个人的剪影:
你可以看到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%
此外,集群2中的整个点都是重复点([0 0 0]):
>> unique(XX(IDX==2,:),'rows')
ans =
0 0 0
另外两个集群看起来像:
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
所以,如果您首先删除重复点,您可能会获得更好的群集
另外,您有几个异常值可能会影响聚类的结果.从目视来看,我将数据范围缩小到包含大部分数据的以下间隔:
>> xlim([-500 100])
>> ylim([-500 100])
>> zlim([900 1500])
这是删除重复点(超过250K点)和异常值(大约250个数据点)之后的结果,并且使用K = 3进行聚类(使用复制选项的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);
在三个集群中几乎相等:
>> tabulate(IDX)
Value Count Percent
1 15605 36.92%
2 15048 35.60%
3 11613 27.48%
回想一下,默认距离函数是欧氏距离,它解释了形成的簇的形状.