K均值(K-means)算法html
K-means 算法是最爲經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一。K-means算法的基本思想是:以空間中k個點爲形心進行聚類,對最靠近他們的對象歸類。經過迭代的方法,逐次更新各簇的形心的值,直至獲得最好的聚類結果。(形心能夠是實際的點、或者是虛擬點)算法
1. 歐氏距離(Euclidean Distance) sql
(1)二維平面上兩點a(x1,y1)與b(x2,y2)間的歐氏距離:apache
(2)三維空間兩點a(x1,y1,z1)與b(x2,y2,z2)間的歐氏距離:數組
(3)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離:app
也能夠用表示成向量運算的形式:dom
(4)Matlab計算歐氏距離ide
Matlab計算距離主要使用pdist函數。若X是一個M×N的矩陣,則pdist(X)將X矩陣M行的每一行做爲一個N維向量,而後計算這M個向量兩兩間的距離。函數
例子:計算向量(0,0)、(1,0)、(0,2)兩兩間的歐式距離
X = [0 0 ; 1 0 ; 0 2]
D = pdist(X,'euclidean')
結果:
D =
2. 曼哈頓距離(Manhattan Distance)
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離
(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離
(3) Matlab計算曼哈頓距離
例子:計算向量(0,0)、(1,0)、(0,2)兩兩間的曼哈頓距離
X = [0 0 ; 1 0 ; 0 2]
D = pdist(X, 'cityblock')
結果:
D = 1
Spark官方提供 kmeans例子:
import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.ml.evaluation.ClusteringEvaluator
import org.apache.spark.sql.SparkSession
object KmeansDemo {
def main(args:Array[String]): Unit ={
val spark = SparkSession
.builder
.appName("KmeansDemo").master("local")
.config("spark.sql.warehouse.dir", "C:\\study\\sparktest")
.getOrCreate()
// Loads data.
val dataset=spark.read.format("libsvm").load("data/mllib/sample_kmeans_data.txt")
// Trains a k-means model.
val kmeans=new KMeans().setK(2).setSeed(1L)
val model=kmeans.fit(dataset)
//Make predictions
val predictions=model.transform(dataset)
// Evaluate clustering by computing Silhouette score
val evaluator = new ClusteringEvaluator()
val silhouette = evaluator.evaluate(predictions)
println(s"Silhouette with squared euclidean distance = $silhouette")
// Shows the result.
println("Cluster Centers: ")
model.clusterCenters.foreach(println)
spark.stop()
}
}
運行結果: