Machine learning Spark中的轮廓聚类

Machine learning Spark中的轮廓聚类,machine-learning,apache-spark,cluster-analysis,distributed-computing,k-means,Machine Learning,Apache Spark,Cluster Analysis,Distributed Computing,K Means,在Spark中使用KMeans聚类时,我想使用剪影来确定k的最佳值。 有什么最佳的并行方法吗?i、 e.使其可伸缩不,根据定义,轮廓是不可伸缩的 它使用成对距离,这将始终需要O(n^2)时间来计算 你需要使用不同的东西。在大数据上使用剪影是荒谬的,计算评估度量要比运行实际的k-means聚类算法花费更长的时间 或者重新考虑你在做什么。例如,使用轮廓是否有意义。您还可以决定在单个节点上运行比Spark更快的东西,在那里计算轮廓,并简单地通过k并行化,而不需要所有分布式计算的开销。 Spark可能会

在Spark中使用KMeans聚类时,我想使用剪影来确定k的最佳值。
有什么最佳的并行方法吗?i、 e.使其可伸缩

不,根据定义,轮廓是不可伸缩的

它使用成对距离,这将始终需要O(n^2)时间来计算

你需要使用不同的东西。在大数据上使用剪影是荒谬的,计算评估度量要比运行实际的k-means聚类算法花费更长的时间

或者重新考虑你在做什么。例如,使用轮廓是否有意义。您还可以决定在单个节点上运行比Spark更快的东西,在那里计算轮廓,并简单地通过k并行化,而不需要所有分布式计算的开销。
Spark可能会战胜MapReduce Mahout,但它会输给一个好的非分布式实现。

是的,有一些方法可以使剪影度量具有可伸缩性。不,它并没有像我在这里描述的那样一路出版。它没有那么复杂,所以你也可以理解它,也许还可以写下来。请告诉我,如果你先写的话,我可以用

看来我们都需要写一个高性能的轮廓记分员。输入任何集群列向量,使该记分器能够处理每个集群实现。如果可能的话,使用mapreduce以实现简单的分布式版本和共享内存。这看起来是可能的。第4页显示了数学: LSH在算法上会有所帮助,因为它避免了主宰其数学的精确距离计算。一个好的LSH实现将是必不可少的,但我还没有找到一个。Sklearn的LSHForest是正确的想法,但实施得不够好。一个简化的轮廓或者近似的轮廓也会很有趣。LSH包含将导致近似结果。使用LSH功能仅查找最近的点和质心,从而避免了所有对的计算。这篇文章的第28页有几个好的建议:它似乎说: 使用简化轮廓而不是普通轮廓,如下所示:将计算从点到点的距离更改为从点到簇质心的距离。这是从簇内的所有点对和最近的相邻簇(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排名等)将他们自己保留下来


上面的格式为代码,但不是代码。它是英文大纲或伪代码。stackoverflow迫使我将此部分格式化为代码以接受它。

ClusteringEvaluator从Spark 2.3.0开始提供,用于计算轮廓分数。

我无法添加注释,但我想突出显示郭玉林的答案:


ClusteringEvaluator从Spark 2.3.0开始提供,它计算轮廓分数


这是中介绍的一个可扩展、高效的实现。

也许可以推荐一种在分布式环境中工作得更好的选择K的替代方法?我没有发现任何方法可以很好地工作,K-means也不适用于大多数数据集。此外,所有可以使用k-均值的数据集都很小。您的内存有多大?单个主机的内存容量为1GB。相信我,使用单节点方法会更快。是的,这些索引中的许多将具有二次复杂性。但它们无论如何都不会产生有意义的结果,所以谁在乎呢?是的,我在乎,但是我想创建实时聚类分析,自然产生的聚类会因情况而异。这就是为什么我需要一些自动化的方法。为什么您认为这些集群评估指标毫无意义?您是否认为没有办法自动选择k值(而且必须始终由人来选择)?您是否考虑过在MLlib
中使用已经实现的平方误差集和内使用,这也可以帮助确定集群的数量[如本文所述?为了感谢Geoffrey Anderson的建议,我最终实现了比多KMeans++论文中的建议稍微复杂的东西,但我的调查从那里开始。我在这里写了一篇关于实现的博客(使用基于Spark RDD的Scala代码)--