<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
}
}
```