Matlab voronoi图

Matlab voronoi图,matlab,cluster-analysis,voronoi,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

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

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

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

对于Delaunay,至少有二维和三维的有效算法。这与计算凸包密切相关。另外,由于您没有太多的群集中心,因此可扩展性也不是那么难

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

但是,在您使用的2D投影中计算Voronoi图将是不准确的。您可以尝试在6D中计算Voronoi单元,并将Voronoi单元的所有角点映射到2D,然后连接相邻的角点。但这可能会产生一大堆混乱的线条,对IMHO来说并没有特别大的帮助

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

别误会:沃罗诺细胞正是k-均值聚类的样子。它们不是球体、水滴或星星。它们是Voronoi细胞:细胞恰好是分配给特定平均值的区域

请看维基百科上的这张图片:

黑线是分隔簇的边界(在二维数据集中是简单的一维线)。在最上面的中间,有一个蓝色的物体正好在这条线的右边。它是蓝色的,因为它在这条线的右边——它在蓝色平均线的沃罗诺单元格中


这是k-means的一个主要缺点:它没有集群空间扩展中的大小概念。它们只有一个中心,数据在两个相邻中心之间的正交超平面上分割对于此特定数据集,k-means*没有机会正确分割数据它没有收敛到一个“坏”的局部极小值,但k-均值无法找到正确的解,因为簇的大小不同(并且簇之间没有足够的间隙,k-均值不可能幸运)。要正确地对该数据集进行聚类,实际上需要一个类似EM的聚类大小概念或基于密度的方法。如果k-means能够检测到绿色的簇大约是蓝色簇的两倍大,它可能会工作得更好(但无论如何,它几乎已经是EM了)

我不确定如果不自己实现聚类和voronoi图,你会怎么做。voronoi在内部使用DelaunyTri来计算边。查看fcm的代码,它在内部没有使用DelaunyTri,因此很难使用DelaunyTri生成集群边缘。感谢Anony,我想我可能对voronoi图感到困惑。我看了一个教程,读了一篇关于stack的帖子,有人上传了他的k-means图,上面有voronoi线(每个图都被命名为voronoi图),所以我不确定。读了你说的话,我想这不是我想要的+1 Voronoi细胞是k-均值的极好可视化。当使用k-means时,需要意识到这是k-means发现的簇的真实形状。不幸的是,我们无法在二维以上的空间中很好地可视化它们。我会在一分钟内用维基百科上的图片更新这个问题,显示你们之间的关系。谢谢你更新你的答案,非常有用。堆栈需要在编辑后实现多个UpVote+1.