matlab空闲,Kmeans matlab“在空闲的集群创建1”错误

这只是告诉你,在重新计算重新计算迭代期间,一个集群变为空(丢失所有分配的点).这通常是由于集群初始化不充分,或者数据的固有集群少于指定的集群.

尝试使用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%

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值