1

我在 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、Evaluate 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”参数控制如果确实发生了要采取的步骤,默认是错误输出。” 这样对吗?有人可以用可靠的来源向我解释吗?有没有办法远离这个错误?

谢谢你。

4

2 回答 2

1

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

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

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

kmeans 的文档

于 2013-05-13T12:43:55.163 回答
1

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

有多种处理方法,例如,您可能决定始终保留集群中之前存在的最后一个点。或者使用新的集群重新启动。或减少 k。

于 2013-05-13T21:19:16.583 回答