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');
4

1 回答 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

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

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

于 2012-07-18T05:21:49.760 回答