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

来源:互联网 发布:中宏产业数据库 编辑:程序博客网 时间:2024/05/17 23:07

原理

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.RDDimport 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]  }}
0 0