使用Kmeans在Spark中聚类小短语

时间:2016-02-22 15:19:34

标签: apache-spark cluster-analysis pyspark k-means apache-spark-mllib

我有一个我希望聚类的单词/短语列表(大约一百万个)。我假设它的列表如下:

a_list = [u'java',u'javascript',u'python dev',u'pyspark',u'c ++']
a_list_rdd = sc.parallelize(a_list)

我遵循这个程序:

使用字符串距离(让我们说jaro winkler度量)我计算单词列表之间的所有距离,这将创建一个5x5的矩阵,对角线为1,因为它计算自身之间的距离。并计算所有距离我广播整个列表。所以:

a_list_rdd_broadcasted = sc.broadcast(a_list_rdd.collect())

和字符串距离计算:

import jaro
def ComputeStringDistance(phrase,phrase_list_broadcasted):
     keyvalueDistances = []
     for value in phrase_list_broadcasted:
         distanceValue = jaro.jaro_winkler_metric(phrase,value)
         keyvalueDistances.append(distanceValue)
     return (array(keyvalueDistances))

string_distances = (a_list_rdd
                             .map(lambda phrase:ComputeStringDistance(phrase,a_list_rdd_broadcasted.value))
                    )

并使用K表示聚类:

from pyspark.mllib.clustering import KMeans, KMeansModel
clusters = KMeans.train(string_distances, 3 , maxIterations=10,
    runs=10, initializationMode="random")
PredictGroup = string_distances.map(lambda point:clusters.predict(point)).zip(a_list_rdd)

和结果:

PredictGroup.collect()

ut[73]: 
[(0, u'java'),
 (0, u'javascript'),
 (2, u'python'),
 (2, u'pyspark'),
 (1, u'c ++')]
不错!但是,如果我有100万个观测值并估计大约10000个星团,会发生什么?阅读一些帖子大量的群集真的很贵。有没有办法绕过这个问题?

1 个答案:

答案 0 :(得分:2)

k-means foes not 在距离矩阵上运行(距离矩阵也不会缩放)。

K-means也使用任意距离函数。

这是关于最小化方差,与平均值的平方偏差之和。

你正在做什么,因为它是光谱聚类的一半,但它既不正确使用k-means,也不是谱聚类。