【问题标题】:Unbalanced factor of KMeans?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 内部没有任何实现,我认为它很容易实现。

标签: apache-spark machine-learning pyspark k-means bigdata


【解决方案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,这有点令人困惑。
猜你喜欢
  • 2019-02-14
  • 2014-01-29
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多