自学Spark有将近一个月了,一直想找一个稍微复杂点的例子练练手,K均值聚类算法实现是个不错的例子,于是有了这篇博客。
K均值聚类算法的原理本身很简单,大概思想就是:选取初始质心,根据这些质心将样本点聚类,聚类之后计算新的质心,然后重新将样本点聚类,不断循环重复“产生质心,重新聚类”这一过程,直至聚类效果不再发生明显变换。Hadoop的MapReduce计算框架虽然也能够实现这一算法,但是代码的实现过程实在是太恶心了,认识到Spark的简洁之后,义无反顾地投入到Spark的怀抱。
写代码时没想太多,测试数据的样本点都是一维的,32个样本点分散在三个区间中,分别是0.2至0.8,1.8至2.4,3.4至4,如下图所示
下面是代码:
package kmeans_spark
import java.util.Random
import java.lang.Math._
import org.apache.spark.rdd.RDD
import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.Vector
object KMeans {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("kmeans in Spark")
val sc = new SparkContext(conf)
val input = args(0) //输入数据
val output = args(1) //输出路径
val k = args(2).toInt //聚类个数
var s = 0d //聚类效果评价标准
val shold = 0.1 //收敛阀值
var s1 = Double.MaxValue
var times = 0
var readyForIteration = true
val func1 = (x: (newVector, Int, Double)