在Apache Spark / PySpark中是否有任何带余弦距离的Kmeans实现?

时间:2017-06-26 12:40:49

标签: apache-spark distance k-means cosine

在Apache Spark中,是否有任何将余弦距离应用于Tf-IDF处理数据帧的KMeans工作实现?

Spark当然在ml库中有欧几里德距离实现,但对于任何其他距离测量都不是这样。

3 个答案:

答案 0 :(得分:2)

我在spark之上实现了我自己的k-means版本,它使用标准的TF-IDF矢量表示和(-ve)余弦相似度作为距离度量code snippet for reference。这个k-means的结果看起来是正确的,而不是像火花k-means那样倾斜。 figure 1 and 2 另外,我通过插入欧几里德距离作为相似性度量(进入我自己的k均值版本)进行实验,结果继续看起来正确,完全不像火花k-means那样倾斜。结果表明它不是距离测量的问题,而是火花的k-means实现的另一个案例(scala mllib)

答案 1 :(得分:0)

KMeans算法基于欧几里德距离,不能直接使用余弦距离。 Here是对这一事实的一个很好的解释:

  

K-Means隐含地基于成对欧几里德距离b / w数据点,因为与质心的平方偏差之和等于成对平方欧几里德距离之和除以点数。

如果您希望使用余弦距离(或任何其他指标),KMedoids可能是一个不错的选择。它与KMeans类似,但在更新步骤中使用中位数而不是均值。这允许使用任意距离度量。

答案 2 :(得分:0)

迟到的更新,以防有人遇到这种情况。当前版本的 spark kmeans 确实实现了余弦距离函数,但默认为 euclidean。对于pyspark,这可以在构造函数中设置:

from pyspark.ml.clustering import KMeans

km = KMeans(distanceMeasure='cosine', k=2, seed=1.0)
# or via setter
km.setDistanceMeasure('cosine')

pyspark docs


对于 Scala 使用 setter:

import org.apache.spark.ml.clustering.KMeans

val km = new KMeans()
km.setDistanceMeasure("cosine")

Scala docs

注意,如果特征向量中有任何零向量,则会抛出异常。