Spark MLlib K-Means聚类

时间:2016-08-10 10:06:25

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

我有一些用纬度,经度和分数定义的地理点,我想使用MLlib K-Means算法来制作聚类。是否可以使用MLlib K-Means,如果可用,我如何将参数或功能传递给算法..据我发现,它读取双数据类型的文本文件并根据它创建聚类。

2 个答案:

答案 0 :(得分:1)

不要在纬度经度数据

上使用k-means

由于失真。地球是一个球体,-180°和+ 180°的距离不是360°。但即使你远离数据线,例如您的所有数据都在旧金山,在Latitude~37.773972,您的失真超过20%,而且越往北走越远。

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

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

答案 1 :(得分:0)

如果您仍然需要使用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. 创建稀疏矢量
  4. 如果您有单词,则可以使用示例-https://spark.apache.org/docs/latest/ml-features.html#word2vec
  5. 创建其向量
  6. 一旦输入数据帧准备好为一列类型为vector的列,则实例化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”文件夹中还有其他示例。