我想知道如何在下面的FCM方法中显示/绘制voronoi图?另外,有没有一种方法可以让你从图中观看程序,因为它在matlab中放置和计算每个点?就像一辆奔跑的拖车。
[centers, U, objFun] = fcm(data, 6);
plot(data(:,1), data(:,2),'o');
maxU = max(U);
index1 = find(U(1, :) == maxU);
index2 = find(U(2, :) == maxU);
line(data(index1,1),data(index1, 2),'linestyle','none',...
'marker','*','color','g');
line(data(index2,1),data(index2, 2),'linestyle','none',...
'marker', '*','color','r');发布于 2012-07-18 13:21:50
对于k-means和FCM,这应该是相同的。
要得到Voronoi图,您需要计算Delaunay三角剖分,然后将Voronoi图的一条边正交放置在每条Delaunay边的平均值上。
至少在2D和3D中都有高效的Delaunay算法。这与计算凸包密切相关。此外,由于您没有很多集群中心,因此可伸缩性并不是那么难。
然而,您有一个大问题:您的数据是6维的。这意味着Voronoi单元格的边实际上是5维的,它们不会平凡地映射到合理的2d投影。
但是,在您使用的2D投影中计算Voronoi图将是不准确的。您可以尝试在6D中计算Voronoi单元,并将voronoi单元的所有角映射到2D,然后连接相邻的角。但这可能会产生一大堆行,而且对IMHO没有特别大的帮助。
对不起,据我所知,Voronoi单元格可视化对于理解2D中的k-means非常有用,如果你有一个很好的3D可视化引擎的话。
不要误会我的意思:Voronoi cells就是k-means集群看起来像的样子。它们不是球体、斑点或星星。它们是Voronoi单元格:单元格恰好是分配给特定均值的区域。
看看这张来自维基百科的图片:

黑线是分隔群集的边框(在2D数据集中是简单的1d线)。在顶部的中心有一个蓝色的物体就在这条线的右边。它是蓝色的,因为它在这条线的右边-它在蓝色均值的Voronoi单元格中。
这是k-means的一个关键缺点:它不像在集群的空间扩展中那样具有大小的概念。它们只有一个中心,数据在两个相邻中心之间的正交超平面上被分割。对于这个特定的数据集,k-means *没有机会正确地拆分数据!它没有收敛到“坏的”局部最小值,但是k-means无法找到正确的解决方案,因为集群的大小不同(对于k-means来说,两者之间没有足够的差距)。要正确地对此数据集进行聚类,您实际上需要一个类似EM的聚类大小概念或基于密度的方法。如果k-means能够检测到绿色集群大约是蓝色集群的两倍,那么它可能会工作得更好(但无论如何,它几乎已经是EM了)。
https://stackoverflow.com/questions/11527918
复制相似问题