我们找到了聚类中心,并在k均值聚类中将点分配给k个不同的聚类箱,这是一种非常著名的算法,几乎可以在网上的每个机器学习包中找到。但是在我看来,缺失和最重要的部分是选择正确的k。最好的价值是什么?而且,什么是最好的?
我使用MATLAB进行科学计算,其中考虑轮廓图是决定此处讨论的 k的一种方法。但是,我会对贝叶斯方法更感兴趣。任何建议表示赞赏。
我们找到了聚类中心,并在k均值聚类中将点分配给k个不同的聚类箱,这是一种非常著名的算法,几乎可以在网上的每个机器学习包中找到。但是在我看来,缺失和最重要的部分是选择正确的k。最好的价值是什么?而且,什么是最好的?
我使用MATLAB进行科学计算,其中考虑轮廓图是决定此处讨论的 k的一种方法。但是,我会对贝叶斯方法更感兴趣。任何建议表示赞赏。
Answers:
这个问题已经在stackoverflow上问了几次:here,here和here。您可以看一下那里的人群对这个问题的看法(或其小变形)。
让我也在stackoverflow.com上复制我对这个问题的答案:
不幸的是,没有办法自动设置“正确的” K,也没有定义什么是“正确的”。没有原则性的统计方法(简单或复杂)可以设置“正确的K”。有启发式的经验法则有时有效,有时无效。
这种情况更为普遍,因为许多聚类方法都具有这些类型的参数,我认为这是聚类/无监督学习研究社区中的一个大问题。
首先要注意。在聚类中,通常没有一个“正确答案”-一个聚类可能比另一个聚类好一个度量标准,反之则可能适用另一度量。在某些情况下,在同一度量标准下,两个不同的聚类可能同等概率。
话虽如此,您可能想看看Dirichlet Processes。另请参阅本教程。
如果从高斯混合模型开始,则与k均值存在相同的问题-必须选择簇数。您可以使用模型证据,但是在这种情况下它不会很可靠。因此,诀窍是先对混合成分使用Dirichlet处理,然后使您可以拥有无限数量的混合成分,但是模型(通常)会自动找到“正确”数量的成分(在该模型)。
注意,您仍然必须先指定Dirichlet Process 的浓度参数。对于较小值,来自DP的样本可能由少量的具有较大权重的原子量度组成。对于较大的值,大多数样本可能是不同的(集中的)。您可以在浓度参数上使用超优先级,然后从数据中推断出它的值,并且该超优先级可能会含糊不清,以允许使用许多不同的可能值。但是,如果有足够的数据,浓度参数将不再那么重要,并且可以放弃此优先级。α
我设法使用“ L方法”来确定地理应用程序中的簇数(即,虽然在技术上不是欧几里得,但本质上是一个二维问题)。
L方法的描述如下: 确定层次聚类/细分算法中的聚类/细分数量Stan Salvador和Philip Chan
本质上,这会评估各种k值的拟合度。可以看到“ L”形图,图中的膝盖代表最佳k值。一个简单的双线最小二乘拟合计算用于找到拐点。
我发现该方法非常慢,因为必须为每个k值计算迭代k均值。我还发现k均值在多次运行中效果最好,并在最后选择了最佳方法。尽管每个数据点只有二维,但不能使用简单的勾股距离。因此,这需要大量的计算。
一种想法是跳过每隔k个值(例如)到一半的计算值和/或减少k个均值迭代的次数,然后稍微平滑所得曲线以产生更准确的拟合。我在StackOverflow -IMHO上问过这个问题,平滑问题仍然是一个开放的研究问题。
您需要重新考虑k均值的作用。它试图找到将数据集划分为单元的最佳Voronoi分区。Voronoi细胞是形状奇怪的细胞,是Delaunay三角剖分的正交结构。
但是,如果您的数据集实际上不适合Voronoi方案怎么办?