Spark MLlib K-Means 聚类
Posted
技术标签:
【中文标题】Spark MLlib K-Means 聚类【英文标题】:Spark MLlib K-Means Clustering 【发布时间】:2016-12-16 15:40:36 【问题描述】:我有一些用纬度、经度和分数定义的地理点,我想使用 MLlib K-Means 算法来制作集群。 MLlib K-Means 是否可用?如果可用,我如何将参数或特征传递给算法..据我发现,它读取双数据类型的文本文件并基于它创建集群。
【问题讨论】:
【参考方案1】:不要对经纬度数据使用 k-means
因为失真。地球是一个球体,-180° 和 +180° 没有 360° 的距离。但即使您远离数据线,例如您的所有数据都在旧金山,纬度 ~37.773972,您的失真超过 20%,并且越往北越严重。
使用 HAC 或 DBSCAN 之类的算法(在好的实现中,有很多不好的实现)与半正弦距离。例如ELKI 具有非常快速的聚类算法,并允许不同的地理距离。即使使用索引加速,对地理点也有很大帮助。
另请参阅此博文:https://doublebyteblog.wordpress.com/2014/05/16/clustering-geospatial-data/
【讨论】:
【参考方案2】:如果您仍然需要使用 MLlib 的 K-mean,那么官方文档位于 -https://spark.apache.org/docs/latest/ml-clustering.html#k-means
-
构建一个数据框,其中包含一个用于保存特征的列。假设列名是“f”的特征。它也可以包含其他不会被触及的列。
此特征列是向量类型。您可以使用示例创建稀疏向量 - https://spark.apache.org/docs/latest/mllib-data-types.html
如果您有单词,那么您可以使用示例创建它们的向量 - https://spark.apache.org/docs/latest/ml-features.html#word2vec
一旦您的输入数据框准备好一列向量类型,实例化 org.apache.spark.ml.clustering.KMeans,设置参数 K 和种子,拟合和预测。你可以使用这个例子 - https://spark.apache.org/docs/latest/ml-clustering.html#k-means
val trainingDataset = //build a dataframe containing a column "f" of type org.apache.spark.mllib.linalg.Vector
val kmeans = new KMeans().setK(2).setSeed(1L).setFeaturesCol("f").setPredictionCol("p")
val model = kmeans.fit(trainingDataset) // your model is ready
//Predict another dataset
val pDataset = //build a dataframe containing a column "f" of type org.apache.spark.mllib.linalg.Vector
val predictions = model.transform(pDataset)
//predictions will contain your prediction on column "p".
在本地 Spark 安装的“example”文件夹中还有其他示例。
【讨论】:
以上是关于Spark MLlib K-Means 聚类的主要内容,如果未能解决你的问题,请参考以下文章
Spark 的 MLlib 库中预定义的 Streaming k-means 聚类是有监督的还是无监督的?
Spark MLlib(下)--机器学习库SparkMLlib实战
Java应用XIV使用Apache Spark MLlib构建机器学习模型下