定义:
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
数据源准备:
0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2
0.2 0.2 0.2
0.3 0.4 0.2
0.5 0.2 0.5
0.6 0.6 0.6
0.7 0.7 0.7
0.2 0.2 0.2
0.2 0.2 0.2
Demo:
object KMeansdemo {
def main(args: Array[String]): Unit = {
//创建SparkContext
val conf = new SparkConf().setMaster("local[4]").setAppName("KMeans")
val sc = new SparkContext(conf)
//加载数据
val path = "kmeans_data.txt"
val data = sc.textFile(path)
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()
//通过KMeans将数据分成两个阵营
val numClusters = 2
val numIterations = 20
val clusters = KMeans.train(parsedData, numClusters, numIterations)
//输出当前的聚类中心
clusters.clusterCenters.foreach(println _)
val index = clusters.predict(Vectors.dense(Array(8.9,7.2,9.0)))
println(s"Vector[8.9, 7.2, 9.0] 属于聚类索引为:${index} 中心坐标为:${clusters.clusterCenters(index)} 的簇")
//计算误差平方和
val WSSSE = clusters.computeCost(parsedData)
println("误差平方和 = " + WSSSE)
sc.stop()
}
}