K-means算法原理

聚類的基本思想

俗話說"物以類聚,人以羣分"算法

聚類(Clustering)是一種無監督學習(unsupervised learning),簡單地說就是把類似的對象歸到同一簇中。簇內的對象越類似,聚類的效果越好。bash

定義:給定一個有個對象的數據集,聚類將數據劃分爲個簇,並且這個劃分知足兩個條件:(1)每一個簇至少包含一個對象;(2)每一個對象屬於且僅屬於一個簇。網絡

基本思想:對給定的,算法首先給出一個初始的劃分方法,之後經過反覆迭代的方法改變劃分,使得每一次改進以後的劃分方案都較前一次更好。機器學習

監督學習(supervised learning):是對具備概念標記(分類)的訓練樣本進行學習,以儘量對訓練樣本集外的數據進行標記(分類)預測。【神經網絡和決策樹】ide

無監督學習(unsupervised learning):是對沒有概念標記(分類)的訓練樣本進行學習,以發現訓練樣本集中的結構性知識。【聚類】函數

K-均值(K-means)聚類算法學習

聚類分析(cluster analysis)試圖將類似對象納入同一簇,將不類似對象歸到不一樣簇大數據

K-Means: K-均值聚類也稱爲快速聚類法,在最小化偏差函數的基礎上將數據劃分爲預約的類數K。該算法原理簡單並便於處理大量數據。優化

K-中心點:K-均值算法對孤立點的敏感性,K-中心點算法不採用簇中對象的平均值做爲簇中心,而選用簇中離平均值最近的對象做爲簇中心。google

系統聚類:也稱爲層次聚類,分類的單位由高到低呈樹形結構,且所處的位置越低,其所包含的對象就越少,但這些對象間的共同特徵越多。該聚類方法只適合在小數據量的時候使用,數據量大的時候速度會很是慢。

 

K-Means算法

K-Means算法是最爲經典的基於劃分的聚簇方法,是十大經典數據挖掘算法之一。簡單的說K-Means就是在沒有任何監督信號的狀況下將數據分爲K份的一種方法。聚類算法就是無監督學習中最多見的一種,給定一組數據,須要聚類算法去挖掘數據中的隱含信息。聚類算法的應用很廣:顧客行爲聚類,google新聞聚類等。

K值是聚類結果中類別的數量。簡單的說就是咱們但願將數據劃分的類別數

 

1、K-Means算法基本思想

在數據集中根據必定策略選擇K個點做爲每一個簇的初始中心,而後觀察剩餘的數據,將數據劃分到距離這K個點最近的簇中,也就是說將數據劃分紅K個簇完成一次劃分,但造成的新簇並不必定是最好的劃分,所以生成的新簇中,從新計算每一個簇的中心點,而後在從新進行劃分,直到每次劃分的結果保持不變。在實際應用中每每通過不少次迭代仍然達不到每次劃分結果保持不變,甚至由於數據的關係,根本就達不到這個終止條件,實際應用中每每採用變通的方法設置一個最大迭代次數,當達到最大迭代次數時,終止計算。

2、算法實現

具體的算法步驟以下:

  1. 隨機選擇K箇中心點
  2. 把每一個數據點分配到離它最近的中心點
  3. 從新計算每類中的點到該類中心點距離的平均值
  4. 分配每一個數據到它最近的中心點
  5. 重複步驟3和4,直到全部的觀測值再也不被分配或是達到最大的迭代次數(R把10次做爲默認迭代次數)。
K-means聚類能處理比層次聚類更大的數據集。另外,觀測值不會永遠被分到一類中,當咱們提升總體解決方案時,聚類方案也會改動。不過不一樣於層次聚類的是,K-means會要求咱們事先肯定要提取的聚類個數

適用範圍及缺陷

K-Menas算法試圖找到使平方偏差準則函數最小的簇。當潛在的簇形狀是凸面的,簇與簇之間區別較明顯,且簇大小相近時,其聚類結果較理想。對於處理大數據集合,該算法很是高效,且伸縮性較好。

但該算法除了要事先肯定簇數K和對初始聚類中心敏感外,常常以局部最優結束,同時對「噪聲」和孤立點敏感,而且該方法不適於發現非凸面形狀的簇或大小差異很大的簇。

克服缺點的方法:使用盡可能多的數據;使用中位數代替均值來克服outlier的問題。

3、K-Means R語言實戰

通常狀況下,沒有必要本身實現K-Means算法,有不少成熟的軟件包實現了K-Means算法,R語言提供了kmeans方法進行聚類分析。

kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE) 
# centers爲提取的聚類數目

進行K-Means劃分時,首先要肯定劃分簇數K,若是對數據有先驗性認知可根據對數據的認知肯定K,在對數據沒有先驗性認知的狀況下,一般經過數據可視化方法肯定K值。咱們以機器學習中經常使用的iris數據集爲例演示如何進行K-Means聚類分析。首先使用主成分分析(PCA)等降維方法將數據將降維投影到二維平面上,經過人工觀察肯定劃分數

library(ggplot2) library(ggfortify) #使用ggfortify包進行聚類結果的可視化展現 newiris <- iris; newiris$Species <- NULL; autoplot(prcomp(newiris))

經過上面的圖形可清晰的看到,數據被劃分紅兩部分,因此K至少大於2,儘管左右兩邊的數據被清晰的分開,但每部分數據是否還能夠進一步劃分紅小聚簇呢,從圖上看不出來。回顧一下K-Means的思想,每一個簇內間距儘量小,咱們嘗試使用不一樣劃分數K進行K-Means聚類,看看不一樣劃分的簇內間距變化狀況。

wss <- c(1:15) for(i in 1:15) wss[i] <- sum(kmeans(newiris,i)$withinss) plot(wss) 


從圖中可見,劃分數在4-15之間,簇內間距變化很小,基本上是水平直線,所以能夠選擇K=4(拐點附近位置)做爲劃分數。聚類計算完成後,咱們使用mds方法觀察一下聚類結果

newiris <- iris; newiris$Species <- NULL; dist.e <- dist(newiris,method='euclidean') #計算各觀測值之間的歐式距離
mds <- cmdscale(dist.e, k=2, eig=T) #cmdscale()計算MDS,爲可視化,取前兩個主座標

x <- mds$points[,1]

y <- mds$points[,2]

k <- kmeans(newiris, 4)

ggplot(data.frame(x,y), aes(x,y)) + geom_point(aes(colour = factor(k$cluster)))
cmdscale()

從圖中能夠觀察到,數據被清晰的劃分爲4個不一樣的區域。

 

r語言中使用dist(x, method = "euclidean",diag = FALSE, upper = FALSE, p = 2) 來計算距離。其中x是樣本矩陣或者數據框。method表示計算哪一種距離。method的取值有:
euclidean 歐幾里德距離,就是平方再開方。
maximum 切比雪夫距離
manhattan 絕對值距離
canberra Lance 距離
minkowski 明科夫斯基距離,使用時要指定p值
binary 定性變量距離.
定性變量距離: 記m個項目裏面的 0:0配對數爲m0 ,1:1配對數爲m1,不能配對數爲m2,距離=m1/(m1+m2);
diag 爲TRUE的時候給出對角線上的距離。upper爲TURE的時候給出上三角矩陣上的值。

4、更進一步

從上面的內容中,咱們知道K-Means經過數據間距遠近來進行劃分操做,對於數值型數據而言,很容易經過歐幾里得距離計算數據間的距離,對於分類等類型的數據則沒法經過歐幾里得距離計算數據的距離。韓家煒教授所著的《數據挖掘 概念與技術》2.4 度量數據的類似性和相異性章節中給出了計算數據間距的具體方法,須要時可按照書中方法進行數據間距計算。

須要說明的是,R語言中的kmeans函數只能接受數值型數據,若是須要對分類等類型的數據進行聚類計算,只能本身實現K-Means算法了,先計算數據距離,而後在編寫K-Means算法進行聚類計算。值得一提的是在R語言中使用edit(kmeans)能夠查看kmeans方法的源代碼,能夠參照源代碼實現定製的K-Means算法。 

歐幾里德距離矩陣

K-Means的細節問題
    1. K值怎麼定?我怎麼知道應該幾類?
      答:這個真的沒有肯定的作法,分幾類主要取決於我的的經驗與感受,一般的作法是多嘗試幾個K值,看分紅幾類的結果更好解釋,更符合分析目的等。或者能夠把各類K值算出的SSE作比較,取最小的SSE的K值。

    2. 初始的K個質心怎麼選?
      答:最經常使用的方法是隨機選,初始質心的選取對最終聚類結果有影響,所以算法必定要多執行幾回,哪一個結果更reasonable,就用哪一個結果。 固然也有一些優化的方法,第一種是選擇彼此距離最遠的點,具體來講就是先選第一個點,而後選離第一個點最遠的當第二個點,而後選第三個點,第三個點到第1、第二兩點的距離之和最小,以此類推。第二種是先根據其餘聚類算法(如層次聚類)獲得聚類結果,從結果中每一個分類選一個點。

    3. K-Means會不會陷入一直選質心的過程,永遠停不下來?
      答:不會,有數學證實K-Means必定會收斂,大體思路是利用SSE的概念(也就是偏差平方和),即每一個點到自身所歸屬質心的距離的平方和,這個平方和是一個函數,而後可以證實這個函數是能夠最終收斂的函數。

    4. 判斷每一個點歸屬哪一個質心的距離怎麼算?
      答:這個問題必須不得不提一下數學了……
      第一種,歐幾里德距離(歐幾里德這位爺仍是很厲害的,《幾何本來》被稱爲古希臘數學的高峯,就是用5個公理推導出了整個平面幾何的結論),這個距離就是平時咱們理解的距離,若是是兩個平面上的點,也就是(X1,Y1),和(X2,Y2),那這倆點距離是多少初中生都會,就是√( (x1-x2)^2+(y1-y2)^2) ,若是是三維空間中呢?√( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 ;推廣到高維空間公式就以此類推。能夠看出,歐幾里德距離真的是數學加減乘除算出來的距離,所以這就是只能用於連續型變量的緣由。
      第二種,餘弦類似度,餘弦類似度用向量空間中兩個向量夾角的餘弦值做爲衡量兩個個體間差別的大小。相比距離度量,餘弦類似度更加註重兩個向量在方向上的差別,而非距離或長度上。下圖表示餘弦類似度的餘弦是哪一個角的餘弦,A,B是三維空間中的兩個向量,這兩個點與三維空間原點連線造成的角,若是角度越小,說明這兩個向量在方向上越接近,在聚類時就歸成一類:


      cosine

      看一個例子(也許不太恰當):歌手大賽,三個評委給三個歌手打分,第一個評委的打分(10,8,9) 第二個評委的打分(4,3,2),第三個評委的打分(8,9,10)
      若是採用餘弦類似度來看每一個評委的差別,雖然每一個評委對同一個選手的評分不同,但第1、第二兩個評委對這四位歌手實力的排序是同樣的,只是第二個評委對滿分有更高的評判標準,說明第1、第二個評委對音樂的品味上是一致的。
      所以,用餘弦類似度來看,第1、第二個評委爲一類人,第三個評委爲另一類。
      若是採用歐氏距離, 第一和第三個評委的歐氏距離更近,就分紅一類人了,但其實不太合理,由於他們對於四位選手的排名都是徹底顛倒的。
      總之,若是注重數值自己的差別,就應該用歐氏距離,若是注重的是上例中的這種的差別(我歸納不出來究竟是一種什麼差別……),就要用餘弦類似度來計算。
      還有其餘的一些計算距離的方法,可是都是歐氏距離和餘弦類似度的衍生,簡單羅列以下:明可夫斯基距離、切比雪夫距離、曼哈頓距離、馬哈拉諾比斯距離、調整後的餘弦類似度、Jaccard類似係數……

    5. 還有一個重要的問題是,你們的單位要一致!
      好比X的單位是米,Y也是米,那麼距離算出來的單位仍是米,是有意義的
      可是若是X是米,Y是噸,用距離公式計算就會出現「米的平方」加上「噸的平方」再開平方,最後算出的東西沒有數學意義,這就有問題了。
      還有,即便X和Y單位一致,可是若是數據中X總體都比較小,好比都是1到10之間的數,Y很大,好比都是1000以上的數,那麼,在計算距離的時候Y起到的做用就比X大不少,X對於距離的影響幾乎能夠忽略,這也有問題。
      所以,若是K-Means聚類中選擇歐幾里德距離計算距離,數據集又出現了上面所述的狀況,就必定要進行數據的標準化(normalization),即將數據按比例縮放,使之落入一個小的特定區間。去除數據的單位限制,將其轉化爲無量綱的純數值,便於不一樣單位或量級的指標可以進行計算和比較。
      標準化方法最經常使用的有兩種:

      • min-max標準化(離差標準化):對原始數據進行線性變換,是結果落到【0,1】區間,轉換方法爲 X'=(X-min)/(max-min),其中max爲樣本數據最大值,min爲樣本數據最小值。
      • z-score標準化(標準差標準化):處理後的數據符合標準正態分佈(均值爲0,方差爲1),轉換公式:X減去均值,再除以標準差
    6. 每一輪迭代如何選出新的質心?
      答:各個維度的算術平均,好比(X1,Y1,Z1)、(X2,Y2,Z2)、(X3,Y3,Z3),那就新質心就是【(X1+X2+X3)/3,(Y1+Y2+Y3)/3,(Z1,Z2,Z3)/3】,這裏要注意,新質心不必定是實際的一個數據點。

    7. 關於離羣值?
      答:離羣值就是遠離總體的,很是異常、很是特殊的數據點,在聚類以前應該將這些「極大」「極小」之類的離羣數據都去掉,不然會對於聚類的結果有影響。可是,離羣值每每自身就頗有分析的價值,能夠把離羣值單獨做爲一類來分析。

    8. 用SPSS做出的K-Means聚類結果,包含ANOVA(單因素方差分析),是什麼意思?
      答:答簡單說就是判斷用於聚類的變量是否對於聚類結果有貢獻,方差分析檢驗結果越顯著的變量,說明對聚類結果越有影響。對於不顯著的變量,能夠考慮從模型中剔除。 

參考:https://my.oschina.net/polaris16/blog/801889

   http://blog.csdn.net/yucan1001/article/details/23123043

    http://www.jianshu.com/p/fc91fed8c77b

相關文章
相關標籤/搜索