KMeans 的不平衡因子?

Posted

技术标签:

【中文标题】KMeans 的不平衡因子?【英文标题】:Unbalanced factor of KMeans? 【发布时间】:2017-01-07 05:10:45 【问题描述】:

编辑:这个问题的答案在Sum in Spark gone bad

中得到了大量讨论

在Compute Cost of Kmeans 中,我们看到了如何计算他的 KMeans 模型的成本。我想知道我们是否能够计算不平衡因子?

如果Spark没有提供这样的功能,有没有简单的方法来实现呢?


我无法找到 Unbalanced 因子的 ref,但它应该类似于 Yael 的 unbalanced_factor(我的 cmets):

// @hist: the number of points assigned to a cluster
// @n:    the number of clusters
double ivec_unbalanced_factor(const int *hist, long n) 
  int vw;
  double tot = 0, uf = 0;

  for (vw = 0 ; vw < n ; vw++) 
    tot += hist[vw];
    uf += hist[vw] * (double) hist[vw];
  

  uf = uf * n / (tot * tot);

  return uf;


我找到了here。

所以这个想法是tot(总计)将等于分配给集群的点数(即等于我们数据集的大小),而uf(不平衡因子)保持平方分配给集群的点数。

最后他使用uf = uf * n / (tot * tot);来计算它。

【问题讨论】:

你能提供一个关于什么是平衡因子的参考吗? @AlbertoBonsanto 它是每个质心有多少点,即在将数据集的点分配给质心之后(我猜是predict()),计算一个表明数据是否平衡的因子跨质心。有趣的是我找不到一个好的参考,但你明白了吗?如果我有 2 个质心,第一个质心分配 100 个点,第二个质心分配 10 个点,那么平衡因子应该不好。如果第一个有60分,第二个有50分,那么平衡因子应该是可以的。所以基本上一个人想计算分配给每个质心的#points 但我发现不平衡,@AlbertoBonsanto,更新了! 好吧,如果Apache SparkKMeansModel 内部没有任何实现,我认为它很容易实现。 【参考方案1】:

python 中可能是这样的:

# I suppose you are passing an RDD of tuples, where the key is the cluster and the value is a vector with the features.
def unbalancedFactor(rdd):
  pdd = rdd.map(lambda x: (x[0], 1)).reduceByKey(lambda a, b: a + b) # you can obtain the number of points per cluster
  n = pdd.count()
  total = pdd.map(lambda x: x[1]).sum() 
  uf = pdd.map(lambda x: x[1] * float(x[1])).sum()

  return uf * n / (total * total)

【讨论】:

有效!因此,该因子的值越小(最小值为 1)越好(即集群是理想平衡的)。你同意吗? 例如,如果我将所有质心设置为仅分配 1 个点,则 uf=1。如果我将数据集总点的一半分配给一个集群,而将所有其他点分配给不同的集群,那么uf = 2。如果我将一个集群分配一个点,另一个集群分配另一个点,并将所有其他点分配给另一个集群,那么uf=2...嗯...我纠正了您代码中的一些错误,您现在应该已经看到了! :) 我会说是的。但是,根据我的经验,Kmeans 并没有您期望的那么强大/有用,因为它无法处理分类变量,并且当维度数量增加时,您得到的结论并不那么清楚。还有其他一些非常先进的替代品(我目前没有它们),我没有使用过,但它们看起来很有希望。 感谢您更正我的代码,我没有测试它,我只是从头开始写的。 理论上是的。但是在处理高维大数据时,甚至是 kmeans++(kmeans 的另一种变体,非常困难),所以我想研究一下 kmeans 能走多远!在我最后一次修复之后,我得到了 1、2.5 和 2.3。我当然知道 Alberto,我刚刚提到它是为了让我们在同一条轨道上(因为我试图了解不平衡因素可以告诉我们什么)!!!!我谢谢你! :D 当每个点被分配到 1 个集群时,它等于 1,而当每个点被分配到不同的集群时,它等于 1,这有点令人困惑。

以上是关于KMeans 的不平衡因子?的主要内容,如果未能解决你的问题,请参考以下文章

AVL平衡二叉树

计算avl树中节点的平衡因子

树总结(二)平衡二叉树

平衡二叉树的构建

如果构建平衡二叉树?

漫画:什么是平衡二叉树?