沃罗诺伊图matlab实现

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

我不确定如果不自己实现聚类和Voronoi图,该怎么做。 Voronoi使用DelaunyTri内部计算边缘。查看fcm的代码,它不会在内部使用DelaunyTri,因此很难使用DelaunyTri来生成聚类边缘。 - slayton
1个回答

3
这对于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 黑线是分隔簇的“边界”(在2D数据集中是简单的1d线)。在顶部中心,有一个蓝色的对象位于线的右侧。它是蓝色的,因为它在线的右侧——它在蓝色平均值的Voronoi单元格中。
这是k-means的一个关键缺点:它没有空间范围的“大小”概念。它们只有一个中心,并且数据被分割在相邻两个中心之间的正交超平面上。对于这个特定的数据集,k-means *没有机会正确地分割数据!*它没有收敛到“坏”的局部最小值,但是正确的解决方案无法通过k-means找到,因为簇具有不同的大小(并且之间没有足够的间隙让k-means运气好)。要正确聚类此数据集,实际上需要EM类似的簇大小概念或密度基础方法。如果k-means能够检测到绿色簇大约是蓝色簇的两倍,它可能会工作得更好(但那时它几乎已经是EM了)。

谢谢Anony,我想我可能对沃罗诺伊图感到困惑。我曾在这里观看教程(http://www.youtube.com/watch?v=aiJ8II94qck),并阅读了一个在Stack上上传了他的k-means图形的人发布的帖子,其中包含沃罗诺伊线(每个图形都被称为沃罗诺伊图),因此我不确定。根据你所说的,我认为这不是我要找的东西。 +1 - G Gr
1
Voronoi细胞是k-means的优秀可视化。在使用k-means时,需要意识到这是k-means找到的聚类的真实形状。不幸的是,在超过2d的情况下,我们无法很好地将它们可视化。我将在一分钟内用来自维基百科的图像更新问题,以展示它们之间的关系。 - Has QUIT--Anony-Mousse
谢谢你更新答案,非常有启发性。Stack需要在编辑后实现多个赞同!+1 - G Gr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接