在 Spark 中使用剪影聚类
Posted
技术标签:
【中文标题】在 Spark 中使用剪影聚类【英文标题】:Using Silhouette Clustering in Spark 【发布时间】:2015-10-30 00:54:23 【问题描述】:在 Spark 中使用 KMeans 聚类时,我想使用轮廓来确定 k 的最佳值。 有什么最佳方法可以并行化吗?即使其可扩展
【问题讨论】:
【参考方案1】:不,根据定义,轮廓不可缩放。
它使用成对距离,这总是需要 O(n^2) 时间来计算。
您将需要使用不同的东西。在大数据上使用 Silhouette 是荒谬的,计算评估度量比运行实际的 k-means 聚类算法需要更长的时间。
或者重新考虑你在做什么。例如,使用剪影是否有意义。您还可以决定在 single 节点上运行比 Spark 更快的东西,在那里计算 Silhouette,然后通过 k 简单地进行并行化,而无需分布式计算的所有开销。 Spark 可能会胜过 MapReduce-Mahout,但会输给良好的非分布式实现。
【讨论】:
也许推荐一种替代方法来选择在分布式环境中效果更好的 K? 我没有找到任何可以很好地工作的方法,k-means 也不适用于大多数数据集。此外,所有可以使用 k-means 的数据集往往都很小。你的有多大? 1 GB 适合单个主机的内存。使用单节点方法,它会更快,相信我。是的,许多这些索引将具有二次复杂度。但无论如何它们都不会产生有意义的结果,所以谁在乎呢? 是的,但我想创建实时聚类分析,自然发生的聚类因情况而异。这就是为什么我需要一些自动化的方法。为什么您认为这些集群评估指标毫无意义?您是否认为没有办法自动选择 k 值(并且必须始终由人类来完成)? 您是否考虑过使用已经在 MLlib 中实现的Within Set Sum of Squared Errors
spark.apache.org/docs/latest/ml-clustering.html#k-means 这也可以帮助确定集群的数量[如此处所述 ***.com/a/15376462/3857701]?【参考方案2】:
是的,有一些方法可以使轮廓度量可扩展。不,它没有像我在这里描述的那样一直发布。它没有那么复杂,所以你也可以理解它,也许可以写出来。请告诉我,如果你先写,我可以使用它。
看起来我们都需要编写一个高性能的剪影得分手。输入任何集群列向量,使此计分器能够与每个集群实现一起工作。如果可能的话,使用 mapreduce 来实现简单的分布式版本以及共享内存。看起来有可能。第 4 页显示了数学: http://cran.us.r-project.org/web/packages/clValid/vignettes/clValid.pdf LSH 在算法上会有所帮助,因为它避免了支配其数学的精确距离计算。一个好的 LSH 实现将是必不可少的,但我还没有找到。 Sklearn 的 LSHForest 是正确的想法,但实施得不够好。简化的轮廓或近似值也会很有趣。 LSH 包含将导致近似结果。使用 LSH 功能仅查找最近的点和质心,从而避免了所有对计算。这篇文章的第28页有几个不错的建议:https://arxiv.org/pdf/1605.01802.pdf 好像在说: 使用简化的轮廓而不是简单的轮廓,如下所示:将计算从点到点的距离更改为从点到簇质心的距离。它是从集群内的所有点对和最近的邻居集群 O(n^2) 减少到线性长度 O(N) 计算。以下是我的理解和翻译:
Start with:
File of cluster tuples: (clusterID, cluster centroid point)
File of example point tuples: (example point, clusterID). Notice the clusterID is the clusterID column vector described above.
Processing:
For each cluster tuple, run a map(): hashmap[clusterID] = cluster centroid point
For each example point tuple, run:
map(): (dist = distance between point and its cluster centroid point, example point (copy), clusterID(copy))
map(): find closest cluster centroid point to the example point
map(): emit SSI = (distance - minClusterDistance)/minClusterDistance
reduce(): By clusterID emit (clusterID, cluster’s sum of SSI / #points)
我最终可能会成为实施者。以前没有人写过这么快的,真是太疯狂了。人们已经在我的预期中做到了,但出于竞争目的(公司利润、Kaggle 排名等),他们将其保留给自己。
以上格式为代码但不是代码。它是英文大纲或伪代码。 *** 迫使我将此部分格式化为代码以接受它。
【讨论】:
想感谢 Geoffrey Anderson 的建议,我最终实现了比 Multiple KMeans++ 论文中的建议更精细的东西,但我的调查从那里开始。我在这里写了一篇关于实现的博客(使用基于 Spark RDD 的 Scala 代码)——sujitpal.blogspot.com/2018/03/…【参考方案3】:ClusteringEvaluator 从 Spark 2.3.0 开始可用,用于计算轮廓分数。
【讨论】:
【参考方案4】:我无法添加评论,但我想强调郭玉林的答案:
ClusteringEvaluator 从 Spark 2.3.0 开始可用,用于计算轮廓分数。
这是SPARK-14516 中引入的可扩展、高效实现。
【讨论】:
以上是关于在 Spark 中使用剪影聚类的主要内容,如果未能解决你的问题,请参考以下文章