SparkMllib之K-Means聚类算法案例

SparkMllib之K-Means聚类算法案例

    • 一、SparkMLlib实现K-Means
    • 二、案例实现

一、SparkMLlib实现K-Means


MLlib的KMeans聚类模型采用KMeans算法来计算聚类中心点。MLlib实现KMeans聚类算法:首先随机生成聚类中心点,支持随机选择样本点当作初始中心点,还支持k-means++方法选择最优的聚类中心点。然后迭代计算样本的中心点,迭代计算中心点的分布式实现是:首先计算每个样本属于哪个中心点,之后采用聚合函数统计属于每个中心点的样本值之和以及样本数量,最后求得最新中心点,并且判断中心点是否发生改变。
MLlib的KMeans聚类模型的runs参数可以设置并行计算聚类中心的数量,runs代表同时计算多组聚类中心点,最后取计算结果最好的那一组中心点作为聚类中心点。

二、案例实现


  1. 测试数据格式
    SparkMllib之K-Means聚类算法案例_第1张图片
  2. 测试数据下载:测试数据下载
  3. 具体代码如下:
    package com.spark.ml
    
    import org.apache.log4j.{
           Level, Logger}
    import org.apache.spark.mllib.clustering._
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.{
           SparkConf, SparkContext}
    
    
    object KMeansDemo {
           
      def main(args: Array[String]) {
           
        //1 构建Spark对象
        val conf = new SparkConf().setAppName("KMeans").setMaster("local[2]")
        val sc = new SparkContext(conf)
        Logger.getRootLogger.setLevel(Level.WARN)
    
        // 读取样本数据1,格式为LIBSVM format
        val data = sc.textFile("testdatas/sample_kmeans_data.data")
        //预测处理 RDD[Vector[Double]]
        val parsedData = data.map(s => Vectors.dense(s.split('\t').map(_.toDouble))).cache()
    
        // 新建KMeans聚类模型,并训练
        val initMode = "k-means||"
        val numClusters = 4
        val numIterations = 100
    
        val model = new KMeans().
          setInitializationMode(initMode).
          setK(numClusters).
          setMaxIterations(numIterations).
          run(parsedData)
    
        val centers = model.clusterCenters
        println("centers")
    
        for (i <- 0 to centers.length - 1) {
           
          println(centers(i)(0) + "\t" + centers(i)(1))
        }
    
        // 误差计算
        val WSSSE = model.computeCost(parsedData)
        println("Within Set Sum of Squared Errors = " + WSSSE)
    
        //保存模型
        val ModelPath = "trans-model/KMeans_Model3"
        model.save(sc, ModelPath)
        val sameModel = KMeansModel.load(sc, ModelPath)
        println(sameModel.clusterCenters)
      }
    }
    
    

你可能感兴趣的:(Spark,聚类,算法,kmeans)