我有一些用纬度,经度和分数定义的地理点,我想使用MLlib K-Means算法来制作聚类。是否可以使用MLlib K-Means,如果可用,我如何将参数或功能传递给算法..据我发现,它读取双数据类型的文本文件并根据它创建聚类。
答案 0 :(得分:1)
由于失真。地球是一个球体,-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
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”文件夹中还有其他示例。