Spark MLlib K 均值聚类

Spark MLlib K-Means Clustering

我有一些用纬度、经度和分数定义的地理点,我想使用 MLlib K-Means 算法来制作聚类。 MLlib K-Means 是否可用?如果可用,我如何将参数或特征传递给算法。据我所知,它读取双数据类型的文本文件并基于它创建集群。

不要对纬度经度数据使用 k-means

因为失真。地球是球体,-180°和+180°没有360°的距离。但即使您远离数据线,例如你所有的数据都在旧金山,在纬度 ~37.773972,你有超过 20% 的 失真,而且越往北越严重。

使用可以与半正弦距离一起使用的算法,例如 HAC 或 DBSCAN(在好的实现中,有很多不好的实现)。例如 ELKI 具有非常快的聚类算法,并允许不同的地理距离。即使有索引加速,对地理点也有很大帮助。

另请参阅此博客 post:https://doublebyteblog.wordpress.com/2014/05/16/clustering-geospatial-data/

如果您仍然需要使用 MLlib 的 K-mean,那么官方文档位于 - https://spark.apache.org/docs/latest/ml-clustering.html#k-means

  1. 构建一个包含用于保存特征的列的数据框。假设列名称是 "f" 的功能。它也可以包含其他不会被触及的列。
  2. 此特征列的类型为 Vector。您可以使用示例创建稀疏向量 - https://spark.apache.org/docs/latest/mllib-data-types.html
  3. 如果你有单词,那么你可以使用示例创建它们的向量 - https://spark.apache.org/docs/latest/ml-features.html#word2vec
  4. 一旦您的输入数据框准备好包含向量类型的列,实例化 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" 文件夹中还有其他可用示例。