<mark>聚类算法属于非监督式学习</mark>,通常被用于探索性的分析,是根据<mark>物以类聚</mark>的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似,常见的典型应用场景有客户细分、客户研究、市场细分、价值评估。
<br/>
MLlib 目前支持广泛使用的 KMeans聚类算法。
<br/>
**1. KMeans聚类算法**
(1)数据`$SPARK_HOME/data/mllib/kmeans_data.txt`
```txt
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
```
(2)代码
```scala
import org.apache.spark.mllib.clustering.KMeansModel
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object KeamsAlgorithm {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]")
.setAppName(this.getClass.getName)
val sc: SparkContext = SparkContext.getOrCreate(conf)
val data: RDD[String] = sc.textFile("F:/mllib/kmeans_data.txt")
val parsedData: RDD[Vector] = data.map(s => Vectors.dense(s.split(" ").map(_.toDouble))).cache()
// 迭代次数
val numIterations = 100
// 类簇个数
val numClusters = 2
// 模型训练
val clusters: KMeansModel = KMeans.train(parsedData, numClusters, numIterations)
// 保存模型
// clusters.save(sc, "F:/mllib/model/kmeans")
// 加载模型
// val clusters2:KMeansModel = KMeansModel.load(sc, "F:/mllib/model/kmeans")
// 通过计算集合内误差平方和来评估聚类的有效性
val trainErr: Double = clusters.computeCost(parsedData)
println(trainErr) // 0.11999999999994547
}
}
```