MLlib中K-means流程

来源:互联网 发布:端口号占用查询 编辑:程序博客网 时间:2024/05/16 23:43

MLlib的聚类算法有K均值算法,LDA算法,二分K均值算法,高斯混合模型等等。以K均值为例。
MLlib中K-means流程如下:
第一步,选择K个点作为初始聚类中心。
第二步,计算其余所有点到聚类中心的距离,并把每个点划分到离它最近的聚类中心所在的聚类中去。在这里,衡量距离一般有多个函数可以选择,最常用的是欧几里得距离(EuclideanDistance),也叫欧式距离。公式如下:

其中C代表中心点,X代表任意一个非中心点。
第三步,重新计算每个聚类中所有点的平均值,并将其作为新的聚类中心点。
最后,重复(二),(三)步的过程,直至聚类中心不再发生改变,或者算法达到预定的迭代次数,又或聚类中心的改变小于预先设定的阀值。
算法的实现在初始聚类点的选择上。MLlib借鉴了一个叫K-means||的类K-means++实现。K-means++算法在初始点选择上遵循一个基本原则:初始聚类中心点相互之间的距离应该尽可能的远。基本步骤如下:
第一步,从数据集X中随机选择一个点作为第一个初始点。
第二步,计算数据集中所有点与最新选择的中心点的距离D(x)。
第三步,选择下一个中心点,使得最大。
第四部,重复(二),(三)步过程,直到K个初始点选择完成。
其实现代码如下:
importorg.apache.spark.ml.clustering.KMeans
//Loadsdata.
valdataset=spark.read.format(“libsvm”).load(“data/mllib/sample_kmeans_data.txt”)
//Trainsak-meansmodel.
valkmeans=newKMeans().setK(2).setSeed(1L)
valmodel=kmeans.fit(dataset)//usefit()methodtoproduceatransformer

//EvaluateclusteringbycomputingWithinSetSumofSquaredErrors.
valWSSSE=model.computeCost(dataset)
println(s”WithinSetSumofSquaredErrors=$WSSSE”)
//Showstheresult.
println(“ClusterCenters:”)
model.clusterCenters.foreach(println)

0 0