SparkMllib之K-Means聚类算法案例
一、SparkMLlib实现K-Means
MLlib的KMeans聚类模型采用KMeans算法来计算聚类中心点。MLlib实现KMeans聚类算法:首先随机生成聚类中心点,支持随机选择样本点当作初始中心点,还支持k-means++方法选择最优的聚类中心点。然后迭代计算样本的中心点,迭代计算中心点的分布式实现是:首先计算每个样本属于哪个中心点,之后采用聚合函数统计属于每个中心点的样本值之和以及样本数量,最后求得最新中心点,并且判断中心点是否发生改变。
MLlib的KMeans聚类模型的runs参数可以设置并行计算聚类中心的数量,runs代表同时计算多组聚类中心点,最后取计算结果最好的那一组中心点作为聚类中心点。
二、案例实现
- 测试数据格式
- 测试数据下载:测试数据下载
- 具体代码如下:
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) } }