我正在使用Spark Mlib进行kmeans聚类.我有一组向量,我想从中确定最可能的聚类中心.因此,我将在此集合上运行kmeans聚类训练,并选择分配了最高矢量数的聚类.
因此,我需要知道训练后分配给每个簇的向量数(即KMeans.run(…)).但我找不到从KMeanModel结果中检索此信息的方法.我可能需要对所有训练向量运行预测并计算出最多的标签.
还有另一种方法吗?
谢谢
最佳答案 你是对的,这个信息不是由模型提供的,你必须运行预测.以下是以并行方式执行此操作的示例(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()轻松验证.