voronoi图matlab

时间:2012-07-17 17:42:16

标签: matlab cluster-analysis voronoi

我想知道如何在下面的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');

1 个答案:

答案 0 :(得分:2)

对于k-means和FCM,这应该是相同的,顺便说一句。

要获得Voronoi图,您需要计算Delaunay三角剖分,然后将Voronoi图的一侧与每个Delaunay边的平均值正交。

至少在2D和3D中有Delaunay的高效算法。这与计算凸包非常密切相关。另外,由于您没有很多集群中心,因此可扩展性并不那么难。

但是,您有一个大问题:您的数据是6维。这意味着你的Voronoi单元格的边实际上是5维的,并且它们不会轻易地映射到合理的2d投影。

计算您正在使用的2D投影中的Voronoi图表将不准确。你可以尝试在6D中计算Voronoi单元,并将voronoi单元的所有角映射到2D,然后连接相邻的角。但这可能会产生一大堆线条,并且对恕我直言并不是特别有用。

很抱歉,据我所知,Voronoi单元格可视化对于理解2D中的k-means以及如果你有一个很好的3D 3D可视化引擎非常有用。

不要误会我的意思: Voronoi单元正是k-means集群的样子。它们不是球体或斑点或星星。它们是Voronoi单元格:单元格恰好是指定给特定均值的区域。

从维基百科看一下这张图片: K-means on wikipedia

黑线是 border (在2D数据集中是简单的1d行),用于分隔簇。在顶部中心,右侧有一个蓝色物体。它是蓝色的,因为它位于线的右侧 - 它位于蓝色均值的Voronoi单元格中。

这是k-means的一个主要缺点:它没有 size 的概念,就像集群中的空间扩展一样。它们只有一个中心,数据在两个相邻中心之间的正交超平面上分开。 对于这个特定的数据集,k-means *没有机会正确分割数据!它没有收敛到“坏”局部最小值,但正确的解决方案不能< / em>通过k-means找到,因为簇具有不同的大小(并且在k-means之间没有足够的间隙来幸运)。要正确地聚类此数据集,您实际上需要类似EM的集群大小概念或基于密度的方法。如果k-means能够检测到绿色簇的大小是蓝色簇的两倍,那么它可能会好得多(但那时它几乎已经是EM)