找到 K-means 集群中的最小方差

Posted

技术标签:

【中文标题】找到 K-means 集群中的最小方差【英文标题】:Finding the minimum variance in K-means cluster 【发布时间】:2015-09-18 05:11:17 【问题描述】:

我有一组 2D 点,我想在其中使用 K-means 算法来划分出正确数量的聚类。

我读到对于固定数量的集群,我应该运行几次并找到给出最小方差的结果。

例如,假设我知道“正确”的簇数为 4。因此,此示例的伪代码:

List<kmeansResult> result;

for(int i = 0 ; i < numIteration; ++i)

    result.Add(kmeans.Compute(4));

我将获得 10 种不同的方法来获得 result 中的 4 个集群,每个集群都有其单独的集群差异。

在这种情况下,我的问题是如何量化“最小”方差。由于方差是二维的,即var(X)var(Y),可能存在var(X) 被最小化但var(Y) 没有被最小化的情况。将两者“合并”在一起的好方法是什么?

【问题讨论】:

总结一下。这将是到集群质心的距离的方差。 @NicoSchertler 您假设covar(X,Y) = 0,这可能适用于整个样本集,但很可能不适用于每个集群。 @amit:我不确定为什么要考虑协方差来计算整体集群方差。除非您正在寻找椭圆表示。你的回答基本上就是我建议的,不是吗? @NicoSchertler“我的”算法(不是我的,见过很多次,包括在 coursera 的机器学习课程中)是求和距离,如果你想要方差 var(X+Y),你需要考虑对于两个随机变量的协方差,var(X+Y) = var(X) + var(Y) +2cov(X,Y),所以如果你想要联合方差,你需要注意协方差。 @amit 同意。但我看不出var(X+Y) 在这里会有什么帮助。我要去var(X) + var(Y),基本上是var( || data point - cluster center ||) 【参考方案1】:

一种常见的做法是尽量减少sum (C_i - x_i) \cdot (C_i - x_i) i=1,...,n,其中:

C_i - i 点的集群中心 x_i - 我的重点 \cdot - 点积 n - 样本数

这个想法是最小化与集群的 L2 距离,从而使每个集群更紧密地结合在一起。

简单来说,它基本上是对每个点到其质心的欧几里得距离求和 - 但没有在 euclidean distance metric 中取平方根。

【讨论】:

我明白了。但是假设在我使用的框架中,它会自动生成方差-协方差矩阵。有没有办法直接使用这个矩阵来最小化? @JohnTan:是的,使用它的迹线(对角线元素的总和)

以上是关于找到 K-means 集群中的最小方差的主要内容,如果未能解决你的问题,请参考以下文章

K-Means:将集群分配给新的数据点

Python - 使用 K-means 进行聚类。一些方差为零的列

Mahout Java API 用于查找使用 k-means 生成的集群的质心

更新 K-Means 聚类中的 K 值

您使用啥方法来选择 k-means 和 EM 中的最佳聚类数?

在 k-means 聚类中最小化损失函数意味着啥?