【问题标题】:Spark KMeans clustering: get the number of sample assigned to a clusterSpark KMeans clustering:获取分配给集群的样本数
【发布时间】:2023-03-22 18:55:01
【问题描述】:

我正在使用 Spark Mlib 进行 kmeans 聚类。我有一组向量,我想从中确定最可能的聚类中心。所以我将在这个集合上运行 kmeans 聚类训练,并选择分配给它的向量数量最多的集群。

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

还有其他方法吗?

谢谢

【问题讨论】:

  • 分层聚类还是 K-means?
  • 嗨,这是kmeans。我已更新问题以使其更清晰
  • 当您说“最可能的集群中心”时,您是指质心吗?
  • 是的。 KMeans.run(parsedData, numClusters, numIterations)。假设我有 numClusters = 3。我想从 3 个结果集群中选择一个分配了大部分向量的集群

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


【解决方案1】:

你是对的,这个信息不是模型提供的,你必须运行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() 轻松验证。

【讨论】:

  • 谢谢。我和它一起去。但这似乎效率低下,因为它们是重复工作。
  • 这取决于您所说的“低效”和“重复工作”:如果您查看source code,您会发现集群索引未包含 在模型中(即不是它们被包含但不可访问)。我想这与 Spark 处理大数据集的目的有关,尽管我同意这一点,对于来自“非大数据”的人' 上下文,它是违反直觉的(就像术语“预测”本身用于聚类一样)......
猜你喜欢
  • 2015-09-03
  • 2016-11-09
  • 2017-07-28
  • 2016-05-21
  • 2019-04-04
  • 2021-07-24
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多