找到 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 集群中的最小方差的主要内容,如果未能解决你的问题,请参考以下文章
Python - 使用 K-means 进行聚类。一些方差为零的列
Mahout Java API 用于查找使用 k-means 生成的集群的质心