kmeans是數據挖掘領域最為常用的聚類方法之一,最初起源於信號處理領域。它的目標是划分整個樣本空間為若干個子空間,每個子空間中的樣本點距離該空間中心點平均距離最小。因此,kmeans是划分聚類的一種。
方法簡單易懂,也很有說服力。但,不幸的是,這是一個NP-hard問題。
首先來看一下NP問題。NP即Non-Deterministic polynomial,非確定性多項式。這里隱含着兩個概念,即多項式問題及非確定性問題。眾所周知,一個問題的復雜度是該問題的實例規模n的多項式函數,因此 可以在多項式時間內解決的確定性問題稱為P問題;非確定性問題相對難以理解,舉個例子,有些問題比如加減乘除,我們可以通過推導,一步步的運算得到結果;但是,還有些問題,我們只能通過間接的猜算來得到結果。比如求取質數,沒有一個公式可以直接得到下一個質數,這樣的問題就叫做非確定性問題。上一個質數的例子中,有一個替代的算法是我們可以驗證一個數是不是質數,這樣通過驗證一定能在多項式時間內猜到這個解,就是多項式非確定性問題,即NP問題。進一步,因為我們找不到np問題的直接算法,就有人提出了是否可以不斷歸約小的np問題為稍微復雜的大的np問題,最終,通過提出一個超級NP問題,所有np問題都可以約化為這個問題,那么,只要解決了這個問題,就解決了所有np問題。這就是NPC問題。值得注意的是, 這種問題的算法復雜度呈指數增長,隨着問題復雜度的增加,很快就無法計算了。如果我們找到一個NPC問題的多項式算法,那么所有的np都能在多項式時間內解決,np問題就變成了p問題,這 就是NP=P?的猜想, 懸賞百萬美圓的千禧難題之首。NP-hard問題同樣難以找到多項式算法,但是它不限定於NP問題。![]()
算法
了解了NP-hard問題之后,我們知道為kmeans計算起來相當困難。好在,有一些被廣泛應用的啟發式算法,可以快速有效的找到局部最優解:- 隨機取k個點作為種子點,每個種子點代表一個類並作為該類的中心點;
- 計算每個樣本點到種子點的距離,把樣本點歸到距離最近的類中,划分出k個類;
- 重新計算每個類的平均值作為新的種子點的位置;
- 迭代2-3,直到種子點不在移動。
距離度量
上面的算法可以看出,距離公式是影響算法的核心因素。這里我們首先討論距離公式的選取。
Minkowski距離
Minkowski距離是衡量數值點之間距離的一種常見方法,假設數值點$P=(x_1,x_2,...,x_n)$和$Q=(y_1,y_2,...,y_n)$,則minkowski距離定義為:
$$(\sum_{i=1}^{n}|x_i-y_i|^p)^{1/p}$$
通過調節參數p,可以得到不同的距離表現形式。最常用的1和2,前者是Manhattan距離,后者為Euclidean距離。如下圖所示,如白色表示高樓,灰色為街道。乘坐出租車從P點到Q點,綠色的斜線表示Euclidean距離(不實際),其他幾條線段表示Manhattan距離。

當p趨於無窮大,轉化為Chebyshev距離:
$$\lim_{p\rightarrow\infty}(\sum_{i=1}^{n}|x_i-y_i|^p)^{1/p}=\mathop{Max}_{i=1}^n|x_i-y_i|$$
Chebyshev距離的物理意義可以想象為,國際象棋中的王,既可以直着橫着走,也可以斜着走,那么從A格前往B格,走的最少的步數就是Chebyshev距離。
我們都知道,平面上到原點的歐幾里得距離為1的點組成圖形為圓形,當p取其他值時如下圖:

以平面點的聚類為例,如果把原點想象成種子點,那么,通過選取不同的p,距離最近的點的分布也不相同,即類的覆蓋范圍呈上圖的形狀。
若x,y軸分別代表樣本的兩種特征,顯然,當$p<1$時,如果x方向的幅值遠遠大於y方向,minkowski距離會過度放大特征x的作用。這就要求我們應該在聚類前對數據進行必要的預處理,或者根據需要給特征不同的權重。稍后將介紹幾種常見的預處理方法。
Minkowski距離的缺點也是顯而易見的
- 各個特征的量綱同等看待;
- 各個特征的分布默認相同。
Mahalanobis距離
馬氏距離測度一個點P與一個分布D之間的距離測度。它的主要思想是測量P相對D的均值的標准差。有兩個優點:
- 量綱無關;
- 排除特征間相關性的干擾。
$$D(X)=\sqrt{(X-\mu)^TS^{-1}(X-\mu)}$$
而其中向量$x_i$與$x_j$的馬氏距離定義為:
$$D(x_i,x_j)=\sqrt{(x_i-x_j)^TS^{-1}(X_i-X_j)}$$
若協方差矩陣S為單位陣(各樣本向量間獨立同分布),則公式變成歐式距離;
若協方差矩陣式對角陣,公式是標准化歐式距離。
cos相似度
余弦相似度為空間中兩個向量的夾角度量,相比前面的距離公式,它更注重個體間趨勢的差異。例如,A=(3,3),B=(5,5),用余弦相似度測量的話,兩者沒有區別。
收斂分析
到這里,整個kmeans方法已經介紹完畢。我們已經可以讓算法運行下去,但是,算法是否每次都能成功收斂,即滿足條件后停止,需要進一步討論。
定義畸變函數(distortion function)
$$J(c,\mu)=\mathop{\sum}_{i=1}^m||x_i-\mu_{c^i}||^2$$
J函數為每個樣本點到其種子點的距離平方和。Kmeans即是要最小化J。我們可以首先固定類別c,調整樣本點的所屬的類別$c^i$讓J變小;然后可以固定$c^i$,調整種子點讓J減小。顯然,當J有界,由於J是非凸函數,kmeans只能得到局部最優解,是一個coordinate descent優化問題。也就是說kmeans對種子點的初始選取比較敏感。但一般情況到達局部最優已經滿足要求,如果怕陷入局部最優,那么可以選擇不同的初始值多跑幾遍,然后選最小J對應的結果作為輸出。
注意問題
從收斂分析已經可以看出kmeans對初始值的選取比較敏感,即我們該如何選取合適的種子點的數量及其位置呢?
K的確定
首先說數目,下面給出幾個常用的方法:
- 與層次聚類結合。通常是采用層次聚類算法決定結果粗的數目,並找到一個初始聚類,然后利用迭代重定位來改進聚類;
- 穩定性方法。對數據集進行兩次采樣產生兩個數據子集,使用相同的聚類方法分別聚類,計算兩個聚類結果相似度的分布情況。具有較高相似度,說明k個聚類反映了穩定的聚類結構。反復試探,直至找到合適的K;
- canopy算法。聚類最耗費計算的地方是計算對象相似性的時候,Canopy首先選擇簡單、計算代價較低的方法計算對象相似性,將相似的對象放在一個子集中,這個子集被叫做Canopy。通過一系列計算得到若干Canopy,Canopy之間可以是重疊的,但不會存在某個對象不屬於任何Canopy的情況,可以把這一階段看做數據預處理。然后,在各個Canopy 內使用傳統的聚類方法(如K-means),不屬於同一Canopy 的對象之間不進行相似性計算。
從這個方法起碼可以看出兩點好處:首先,Canopy 不要太大且Canopy 之間重疊的不要太多的話會大大減少后續需要計算相似性的對象的個數;其次,類似於K-means這樣的聚類方法是需要人為指出K的值的,通過得到的Canopy 個數完全可以作為這個K值,一定程度上減少了選擇K的盲目性。
- 貝葉斯信息准則。
種子點的選取
- 隨機選取初始位置。可以運行多次比較結果,選取具有最小J值的方案;
- 隨機選一個點,或者所有點的質心作為種子點。然后,對於每一個后繼種子點,選取與前面所有種子點最遠的點。這樣,不僅確保是初始點是隨機,並且是散開的。但是這種方法容易選到離群點。
適用范圍及缺陷
Kmeans算法試圖找到使平均誤差准則函數最小的簇。當潛在的簇形狀是凸面的,簇與簇之間區別較明顯,且簇大小相近時,其聚類結果較理想。
而且,對於處理大數據集合,該算法非常高效,且伸縮性較好。
但是,該算法除了要事先確定簇數K和對初始聚類中心敏感外,經常以局部最優結束,同時對“噪聲”和孤立點敏感,並且該方法不適於發現非凸面形狀的簇或大小差別很大的簇。
擴展
針對以上的缺陷,很多研究者提出了相應的對策。
kmeans++
即上述種子點選取的第二種方法。
kmedoids(PAM,Partitioning Around Medoids)
能夠解決kmeans對噪聲敏感的問題。kmeans尋找種子點的時候計算該類中所有樣本的平均值,如果該類中具有較為明顯的離群點,會造成種子點與期望偏差過大。例如,A(1,1),B(2,2),C(3,3),D(1000,1000),顯然D點會拉動種子點向其偏移。這樣,在下一輪迭代時,將大量不該屬於該類的樣本點錯誤的划入該類。
為了解決這個問題,kmedoids方法采取新的種子點選取方式,1)只從樣本點中選;2)選取標准能夠提高聚類效果,例如上述的最小化J函數,或者自定義其他的代價函數。
但是,kmedoids方法提高了聚類的復雜度。
Gaussian mixture
實際上,Gaussian Mixture Model(GMM)也是很流行的聚類方法,詳細的內容以后再講。因為它和Kmeans比較像,在這里提一下。
kmeans為每個樣本點指派一個類別,要么屬於這個類,要不不屬於,因此成為硬聚類。GMM可以看作kmeans的軟聚類版本,即每個樣本點以一定的概率屬於某個類別。基本思想是使用EM算法使似然函數最大化(類似最小化J函數),但是保留類的概率分布代替直接指派屬於哪個類,並且使用高斯分布代替平均值的計算。