Spark MLlib聚类clustering:KMeans K均值 ---原理及实战

原理

KMeans,即K均值。K:K个Cluster,Means:均值,每个Cluster以均值为中心点。

KMeans train方法的重要参数:

data: RDD[Vector] 输入数据类型

k: Int cluster数目

maxIterations: Int 最大迭代次数

runs: Int 并行度,会返回最佳model

initializationMode: String 初始中心点选择方式,”random” 或 “k-means||” (default)

seed: Long 随机种子,在初始化中心点时会用到

通常需要设置的是:k、maxIterations、runs


MLlib中KMeans原理:

A、选取k个点作为初始聚类中心点

B、计算每一个点到每一个中心点的距离,并把这个点归到最近中心点所在的Cluster中去

C、计算每个Cluster新中心点。 center=mean=sum/count

D、计算准则函数:每个Cluster新中心点与上一次迭代对应中心点之间的距离是否都 阈值。如果都满足阈值则退出迭代。否则更新中心

点,重复B、C、D。

E、最终退出条件:每一个Cluster中心点都满足阈值或达到最大迭代次数。runs是并行度,可简单理解为以上步骤同时运行了runs次,得

到runs组,每组k个中心点,取出最好的那一组,得到最终KMeansModel,该model中保存了k个最优中心点。

实战

import org.apache.spark.mllib.clustering.{KMeansModel, KMeans}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkContext, SparkConf}

object KmeansExample {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("KmeansExample").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val data = sc.textFile("data/kmeans.txt")
    val train: RDD[Vector] = data.map(line=>Vectors.dense(line.split(",").map(_.toDouble)))

    // 训练kMeans模型
    // 参数解释:
    // data: RDD[Vector]    data:数据类型
    // k: Int               k:k个cluster
    // maxIterations: Int   maxIterations:最大迭代次数
    // runs: Int            runs:并行度,同时运行runs个Kmeans,返回最好的那个

    // k=2  maxIterations=4  runs=3
    val kMeansModel: KMeansModel = KMeans.train(train,2,4,3)
    // 得到最佳中心点

    kMeansModel.clusterCenters.foreach(println)
    //[0.1,0.1,0.1]
    //[9.1,9.1,9.1]
  }
}

你可能感兴趣的:(机器学习)