在 PySpark 中运行 KMeans 聚类

Posted

技术标签:

【中文标题】在 PySpark 中运行 KMeans 聚类【英文标题】:Running KMeans clustering in PySpark 【发布时间】:2018-05-15 01:48:48 【问题描述】:

这是我第一次尝试在 Spark 中运行 KMeans 聚类分析,所以,对于一个愚蠢的问题,我深表歉意。

我有一个包含许多列的 spark 数据框 mydataframe。我只想在两列上运行 kmeans:latlong(纬度和经度)将它们用作简单值。我想仅基于这 2 列提取 7 个集群。我试过了:

from numpy import array
from math import sqrt
from pyspark.mllib.clustering import KMeans, KMeansModel

# Prepare a data frame with just 2 columns:
data = mydataframe.select('lat', 'long')

# Build the model (cluster the data)
clusters = KMeans.train(data, 7, maxIterations=15, initializationMode="random")

但我收到一个错误:

'DataFrame' 对象没有属性 'map'

KMeans.train 提供的对象应该是什么? 显然,它不接受 DataFrame。 我应该如何为分析准备数据框?

非常感谢!

【问题讨论】:

【参考方案1】:

KMeans.train 方法将 RDD 而非数据帧(数据)作为输入。因此,您只需要将数据转换为 rdd:data.rdd。 希望对您有所帮助。

【讨论】:

太好了,非常感谢!另外,我刚刚在这里发现了一个简短的提及:spark.apache.org/docs/1.0.1/api/java/org/apache/spark/mllib/… - 那么,除了作为 RDD 之外,RDD 还应该被缓存? 这样就够了吗?:data_rdd = data.rdd data_rdd.cache() - 然后:clusters = KMeans.train(data_rdd, 7, maxIterations=15, initializationMode="random") 是的,也应该缓存(为了高速),你的语句就够了

以上是关于在 PySpark 中运行 KMeans 聚类的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中使用 Kmeans 对小短语进行聚类

如何在不耗尽内存的情况下运行大型 Mahout 模糊 kmeans 聚类?

如何从本地目录中读取,kmeans 流式传输 pyspark

在 python / pyspark 中获取 k-means 质心和异常值

opencv:如何使用kmeans()按角度聚类

使用二叉树结构的 KMeans 算法中的数据聚类