kmeans

K均值(K-means)算法html

    K-means 算法是最爲經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一。K-means算法的基本思想是:以空間中k個點爲形心進行聚類,對最靠近他們的對象歸類。經過迭代的方法,逐次更新各簇的形心的值,直至獲得最好的聚類結果。(形心能夠是實際的點、或者是虛擬點)算法

 

假設要把樣本集分爲c個簇,算法描述以下:
(1)適當選擇c個簇的初始形心;
(2)在第k次迭代中,對任意一個樣本,求其到c個形心的歐氏距離或曼哈頓距離,將該樣本歸類到距離最小的形心所在的簇;
(3)利用均值等方法更新該簇的形心值;
(4)對於全部的c個簇形心,若是利用(2)(3)的 迭代法更新後,當形心更新穩定或偏差平方和最小時,則迭代結束,不然繼續迭代。(偏差平方和即簇內全部點到形心的距離之和)

  求點羣中心的算法

  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 =    1.0000    2.0000    2.2361

2. 曼哈頓距離(Manhattan Distance)

       想象你在曼哈頓要從一個十字路口開車到另一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個曼哈頓距離。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱爲城市街區距離(City Block 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 =     2     3

算法的優缺點:
一、優勢
(1)k-平均算法是解決聚類問題的一種經典算法,算法簡單、快速。
(2)對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt), 其中n 是全部對象的數目,k 是簇的數目,t 是迭代的次數。一般k<<n。這個算法常常以局部 最優結束。
(3)算法嘗試找出使平方偏差函數值最小的k 個劃分。當簇是密集的、球狀或團狀的,而簇 與簇之間區別明顯時,它的聚類效果很好。
二、缺點
(1)要求用戶必須事先給出要生成的簇的數目k,這個K值的選定是很是難以估計的。不少時候,事先並不知道給定的數據集應該分紅多少個類別才最合適。(ISODATA算法經過類的自動合併和分裂,獲得較爲合理的類型數目K)
(2)K-Means算法須要用初始隨機種子點選擇初始聚類中心。這個隨機種子點過重要,不一樣的隨機種子點會有獲得徹底不一樣的結果。(K-Means++算法能夠用來解決這個問題,其能夠有效地選擇初始點)
(3)對初值敏感,對於不一樣的初始值,可能會致使不一樣的聚類結果。
(4)不適合於發現非凸面形狀的簇,或者大小差異很大的簇。
(5)對於"噪聲"和孤立點數據敏感,少許的該類數據可以對平均值產生極大影響。

 

K-Means++算法
先從咱們的數據庫隨機挑個隨機點當「種子點」。
對於每一個點,咱們都計算其和最近的一個「種子點」的距離D(x)並保存在一個數組裏,而後把這些距離加起來獲得Sum(D(x))。
選擇一個新的數據點做爲新的聚類中心,選擇的原則是:D(x)較大的點,被選取做爲聚類中心的機率較大(一種方法:再取一個隨機值,用權重的方式來取計算下一個「種子點」。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,而後用Random -= D(x),直到其<=0,此時的點就是下一個「種子點」。)
重複第(2)和第(3)步直到全部的K個種子點都被選出來。
進行K-Means算法。  

 

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()
}
}

 

運行結果:

18/10/23 15:41:31 INFO BlockManagerInfo: Removed broadcast_25_piece0 on 10.200.78.114:60410 in memory (size: 519.0 B, free: 1992.8 MB)
Silhouette with squared euclidean distance = 0.9997530305375207
Cluster Centers: 
[0.1,0.1,0.1]
[9.1,9.1,9.1]
相關文章
相關標籤/搜索