群集:初始期间“丢失”其成员的错误。可能?

时间:2013-05-13 07:08:20

标签: matlab cluster-analysis k-means

我在MATLAB GUI中使用k-means。我已经完成了它。程序(GUI)工作得很好(在命令窗口,它完美地工作)。我不知道,有时GUI工作正常,但有时会突然出现错误。以下是错误消息:

??? Error while evaluating uicontrol Callback

??? Error using ==> kmeans>batchUpdate at 436
Empty cluster created at iteration 1.

Error in ==> kmeans at 337
        converged = batchUpdate();

Error in ==> CalcRand at 4
[g c] = kmeans(data,k,'dist','SqEuclidean');

Error in ==> kmeansFIN2>Centroid_Callback at 203
    [g,c,y,clr]=CalcRand( data,k );

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> kmeansFIN2 at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)kmeansFIN2('Centroid_Callback',hObject,eventdata,guidata(hObject))


??? Error while evaluating uicontrol Callback

一点解释:我的GUI有4个按钮,它们是Cluster,Show Centroid,Show the Graphic,Evalu the Graphic。我可以在这里提供我的代码,但它太长了,所以我只是给出了一些我的代码:

% CLUSTER (PUSH BUTTON)
[g c] = kmeans(cobat,k,'dist','SqEuclidean');
y = [cobat g]

% SHOW CENTROID (PUSH BUTTON)
c

% EVALUATE THE CLUSTER
[s,h]=silhouette(cobat,g,'SqEuclidean');

% SHOW THE GRAPHIC
%# show points and clusters (color-coded)
clr = lines(k);
figure, hold on
scatter3(cobat(:,1), cobat(:,2), cobat(:,3), 36, clr(g,:), 'Marker','.')
scatter3(c(:,1), c(:,2), c(:,3), 100, clr, 'Marker','o', 'LineWidth',3)
hold off
view(3), axis vis3d, box on, rotate3d on
xlabel('x'), ylabel('y'), zlabel('z')

根据错误,有人说,“群集可能会在群集的初始阶段”丢失“所有成员;这就是K-Means算法的工作方式。通常会发生这种情况的原因是一个很好的选择启动集群质心 'EmptyAction'参数控制如果确实发生了什么步骤,默认是错误输出。“是不是?有人可以用可靠的来源解释我吗?还有办法远离这个错误吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

是的,在k-means算法中,一个集群可能会丢失其所有成员。这可能发生在算法的任何阶段;然而,最可能的原因是初始聚类质心选择不当,在这种情况下,它很可能发生在算法的早期阶段。

MATLAB的kmeans算法有一个参数EmptyAction,用于指定在这种情况下应该做什么。 EmptyAction可以设置为error(默认值),drop(在这种情况下,群集被删除,相应的返回值设置为NaN)或singleton(其中)例如,创建一个新集群作为距离其质心最远的单个点。

选择dropsingleton应该允许算法继续完成,但是您仍然应该意识到初始质心很难选择,在这种情况下你应该试着解决这个问题。

Documentation for kmeans

答案 1 :(得分:1)

正如@SamRoberts已经说过的那样:是的,k-means中的集群可能变空。这可能不会发生在您的平均合成数据集中,但在实际数据中它可以发生;特别是当您使用离散或更糟的数据时:二进制。

有多种方法可以解决这个问题,例如,您可能决定始终保留群集中的最后一个点。或者使用新群集重新启动。或减少k。