Clustering: K-means

轉自 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html
K-means也是聚類算法中最簡單的一種了,但是里面包含的思想卻是不一般。最早我使用并實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義后才有些明白K-means后面包含的EM思想。

   聚類屬于無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標簽y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特征x,比如假設宇宙中的星星可以表示成三維空間中的點集[![clip_image002[10]](http://upload-images.jianshu.io/upload_images/2761157-22636e5b2f5ff352.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104061601448600.png)。聚類的目的是找到每個樣本x潛在的類別y,并將同類別y的樣本x放在一起。比如上面的星星,聚類后結果是一個個星團,星團里面的點相互距離比較近,星團間的星星距離就比較遠了。
 在聚類問題中,給我們的訓練樣本是[![clip_image004](http://upload-images.jianshu.io/upload_images/2761157-3aa161e5ae212b96.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104061601448982.png),每個[![clip_image006](http://upload-images.jianshu.io/upload_images/2761157-417f48df2b247be5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104061601453159.png),沒有了y。
 K-means算法是將樣本聚類成k個簇(cluster),具體算法描述如下:

1、 隨機選取k個聚類質心點(cluster centroids)為


2、 重復下面過程直到收斂 {
對于每一個樣例i,計算其應該屬于的類
clip_image009

對于每一個類j,重新計算該類的質心
clip_image010[6]

}

K是我們事先給定的聚類數,C(i)代表樣例i與k個類中距離最近的那個類,C(i)的值是1到k中的一個。質心ui代表我們對屬于同一個類的樣本中心點的猜測,拿星團模型來解釋就是要將所有的星星聚成k個星團,首先隨機選取k個宇宙中的點(或者k個星星)作為k個星團的質心,然后第一步對于每一個星星計算其到k個質心中每一個的距離,然后選取距離最近的那個星團作為C(i),這樣經過第一步每一個星星都有了所屬的星團;第二步對于每一個星團,重新計算它的質心ui(對里面所有的星星坐標求平均)。重復迭代第一步和第二步直到質心不變或者變化很小。

下圖展示了對n個樣本點進行K-means聚類的效果,這里k取2。

K-means面對的第一個問題是如何保證收斂,前面的算法中強調結束條件就是收斂,可以證明的是K-means完全可以保證收斂性。下面我們定性的描述一下收斂性,我們定義畸變函數(distortion function)如下:

J函數表示每個樣本點到其質心的距離平方和。K-means是要將J調整到最小。假設當前J沒有達到最小值,那么首先可以固定每個類的質心ui,調整每個樣例的所屬的類別C(i)來讓J函數減少,同樣,固定C(i),調整每個類的質心ui也可以使J減小。這兩個過程就是內循環中使J單調遞減的過程。當J遞減到最小時,u和c也同時收斂。(在理論上,可以有多組不同的u和c值能夠使得J取得最小值,但這種現象實際上很少見)。

由于畸變函數J是非凸函數,意味著我們不能保證取得的最小值是全局最小值,也就是說k-means對質心初始位置的選取比較感冒,但一般情況下k-means達到的局部最優已經滿足需求。但如果你怕陷入局部最優,那么可以選取不同的初始值跑多遍k-means,然后取其中最小的J對應的u和c輸出。

下面累述一下K-means與EM的關系,首先回到初始問題,我們目的是將樣本分成k個類,其實說白了就是求每個樣例x的隱含類別y,然后利用隱含類別將x歸類。由于我們事先不知道類別y,那么我們首先可以對每個樣例假定一個y吧,但是怎么知道假定的對不對呢?怎么評價假定的好不好呢?我們使用樣本的極大似然估計來度量,這里是就是x和y的聯合分布P(x,y)了。如果找到的y能夠使P(x,y)最大,那么我們找到的y就是樣例x的最佳類別了,x順手就聚類了。但是我們第一次指定的y不一定會讓P(x,y)最大,而且P(x,y)還依賴于其他未知參數,當然在給定y的情況下,我們可以調整其他參數讓P(x,y)最大。但是調整完參數后,我們發現有更好的y可以指定,那么我們重新指定y,然后再計算P(x,y)最大時的參數,反復迭代直至沒有更好的y可以指定。

這個過程有幾個難點,第一怎么假定y?是每個樣例硬指派一個y還是不同的y有不同的概率,概率如何度量。第二如何估計P(x,y),P(x,y)還可能依賴很多其他參數,如何調整里面的參數讓P(x,y)最大。這些問題在以后的篇章里回答。

這里只是指出EM的思想,E步就是估計隱含類別y的期望值,M步調整其他參數使得在給定類別y的情況下,極大似然估計P(x,y)能夠達到極大值。然后在其他參數確定的情況下,重新估計y,周而復始,直至收斂。

上面的闡述有點費解,對應于K-means來說就是我們一開始不知道每個樣例X(i)對應隱含變量也就是最佳類別c(i)。最開始可以隨便指定一個c(i)給它,然后為了讓P(x,y)最大(這里是要讓J最小),我們求出在給定c情況下,J最小時的u(i)(前面提到的其他未知參數),然而此時發現,可以有更好的c(i)(質心與樣例x(i)距離最小的類別)指定給樣例x(i),那么c(i)得到重新調整,上述過程就開始重復了,直到沒有更好的c(i)指定。這樣從K-means里我們可以看出它其實就是EM的體現,E步是確定隱含類別變量c,M步更新其他參數u來使J最小化。這里的隱含類別變量指定方法比較特殊,屬于硬指定,從k個類別中硬選出一個給樣例,而不是對每個類別賦予不同的概率。總體思想還是一個迭代優化過程,有目標函數,也有參數變量,只是多了個隱含變量,確定其他參數估計隱含變量,再確定隱含變量估計其他參數,直至目標函數最優。

**Part 2 — K-Means中K的選擇

對這個問題一直很陌生,1到正無窮,肯定有那么幾個k能夠使得數據有比較好的聚類結果,怎么找一下呢?

File:DataClustering ElbowCriterion.JPG
File:DataClustering ElbowCriterion.JPG

先把一些 已經存在的比較經典的方法收藏下
1、stackoverflow上面的答案
You can maximize the Bayesian Information Criterion (BIC):
BIC(C|X)=L(X|C)?(p/2)?log n

where L(X|C) is the log-likelihood of the dataset X according to model C, p is the number of parameters in the model C, and n is the number of points in the dataset. See "X-means: extending K-means with efficient estimation of the number of clusters" by Dan Pelleg and Andrew Moore in ICML 2000.

Another approach is to start with a large value for k and keep removing centroids (reducing k) until it no longer reduces the description length. See "MDL principle for robust vector quantisation" by Horst Bischof, Ales Leonardis, and Alexander Selb in Pattern Analysis and Applications vol. 2, p. 59-72, 1999.

Finally, you can start with one cluster, then keep splitting clusters until the points assigned to each cluster have a Gaussian distribution. In "Learning the k in k-means" (NIPS 2003), Greg Hamerly and Charles Elkan show some evidence that this works better than BIC, and that BIC does not penalize the model's complexity strongly enough.
Bayesian k-means may be a solution when you don't know the number of clusters. There's a related paper given in the website and the corresponding MATLAB code is also given.

2、wiki上有專題:
Determining the number of clusters in a data set
Part 3 — Matlab中K-means的使用方法:K-means clustering - MATLAB kmeans - MathWorks China
Matlab中的使用方法如下:
[plain] view plain copy

IDX = kmeans(X,k)
[IDX,C] = kmeans(X,k)
[IDX,C,sumd] = kmeans(X,k)
[IDX,C,sumd,D] = kmeans(X,k)
[...] = kmeans(...,param1,val1,param2,val2,...)

各輸入輸出參數介紹:X:N*P的數據矩陣K:表示將X劃分為幾類,為整數Idx:N*1的向量,存儲的是每個點的聚類標號C:K*P的矩陣,存儲的是K個聚類質心位置sumD: 1*K的和向量,存儲的是類間所有點與該類質心點距離之和D:N*K的矩陣,存儲的是每個點與所有質心的距離即:K-means聚類算法采用的是將N*P的矩陣X劃分為K個類,使得類內對象之間的距離最大,而類之間的距離最小。

最后的:[…] = kmeans(…,param1 val1,param2,val2,…),這其中的參數param1、param2等,主要可以設置為如下:1、distance(距離測度) sqEuclidean 歐式距離(默認時,采用此距離方式) cityblock 絕度誤差和,又稱:L1 cosine針對向量 correlation 針對有時序關系的值 Hamming 只針對二進制數據2、start(初始質心位置選擇方法) sample從X中隨機選取K個質心點 uniform根據X的分布范圍均勻的隨機生成K個質心 cluster 初始聚類階段隨機選擇10%的X的子樣本(此方法初始使用sample方法) matrix 提供一K*P的矩陣,作為初始質心位置集合3、replicates(聚類重復次數)整數 使用案例:

[plain] view plain copy

派生到我的代碼片
派生到我的代碼片

data=
5.0 3.5 1.3 0.3 -1
5.5 2.6 4.4 1.2 0
6.7 3.1 5.6 2.4 1
5.0 3.3 1.4 0.2 -1
5.9 3.0 5.1 1.8 1
5.8 2.6 4.0 1.2 0

[Idx,C,sumD,D]=Kmeans(data,3,'dist','sqEuclidean','rep',4)

運行結果:
Idx =
1
2
3
1
3
2
C =
5.0000 3.4000 1.3500 0.2500 -1.0000
5.6500 2.6000 4.2000 1.2000 0
6.3000 3.0500 5.3500 2.1000 1.0000
sumD =
0.0300
0.1250
0.6300
D =
0.0150 11.4525 25.5350
12.0950 0.0625 3.5550
29.6650 5.7525 0.3150
0.0150 10.7525 24.9650
21.4350 2.3925 0.3150
10.2050 0.0625 4.0850

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容