Spark KMeans集群:获取分配给集群的样本数

时间:2015-11-03 09:17:00

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

我正在使用Spark Mlib进行kmeans聚类。我有一组向量,我想从中确定最可能的聚类中心。因此,我将在此集合上运行kmeans聚类训练,并选择分配了最高矢量数的聚类。

因此,我需要知道训练后分配给每个簇的向量数(即KMeans.run(...))。但我找不到从KMeanModel结果中检索此信息的方法。我可能需要在所有训练向量上运行predict并计算出最多的标签。

还有其他办法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您说得对,模型不提供此信息,您必须运行predict。以下是以并行方式(Spark v.1.5.1)执行此操作的示例:

 from pyspark.mllib.clustering import KMeans
 from numpy import array
 data = array([0.0,0.0, 1.0,1.0, 9.0,8.0, 8.0,9.0, 10.0, 9.0]).reshape(5, 2)
 data
 # array([[  0.,   0.],
 #       [  1.,   1.],
 #       [  9.,   8.],
 #       [  8.,   9.],
 #       [ 10.,   9.]])

 k = 2 # no. of clusters
 model = KMeans.train(
                sc.parallelize(data), k, maxIterations=10, runs=30, initializationMode="random",
                seed=50, initializationSteps=5, epsilon=1e-4)

 cluster_ind = model.predict(sc.parallelize(data))
 cluster_ind.collect()
 # [1, 1, 0, 0, 0]

cluster_ind是与我们的初始数据具有相同基数的RDD,它显示每个数据点属于哪个群集。所以,这里有两个集群,一个集群有3个数据点(集群0),另一个集群有2个数据点集群(集群1)。请注意,我们已经以并行方式运行预测方法(即在RDD上) - 此处collect()仅用于我们的演示目的,并且在“真实”情况下不需要它。

现在,我们可以使用

获取群集大小
 cluster_sizes = cluster_ind.countByValue().items()
 cluster_sizes
 # [(0, 3), (1, 2)]

由此,我们可以得到最大的聚类索引&大小为

 from operator import itemgetter
 max(cluster_sizes, key=itemgetter(1))
 # (0, 3)

即。我们最大的群集是群集0,大小为3个数据点,可以通过检查上面的cluster_ind.collect()轻松验证。