【问题标题】:Spark MLlib K-Means ClusteringSpark MLlib K-Means 聚类
【发布时间】:2016-12-16 15:40:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案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

      1. 构建一个数据框,其中包含一个用于保存特征的列。假设列名是“f”的特征。它也可以包含其他不会被触及的列。
      2. 此特征列是向量类型。您可以使用示例创建稀疏向量 - 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”文件夹中还有其他示例。

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 2017-03-30
        • 2014-09-30
        • 2015-04-11
        • 2015-01-16
        • 1970-01-01
        • 2017-03-07
        • 2011-08-13
        • 2013-08-08
        相关资源
        最近更新 更多