k-means聚類分析


 k-means算法是machine learning領域內比較常用的算法之一。

     首先,我們先來講下該算法的流程(摘自百度百科):

     首先從n個數據對象任意選擇 k 個對象作為初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然 后再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復這一過程直到標准測度函數開始收斂為止。一般都采用均方差作為標准測度函數. k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。

      以上就是k-means的算法流程了,算法的流程其實還是比較簡單的,今天我着重從數學的角度來講一下我所理解的k-means聚類算法。

      假設我們有N個樣本數據集{x1,...,xN},變量x的維數為D維,我們現在要將這些數據集分成k類(注意k已知變量)。我們將問題進行轉化,可以構造這樣的等式,引進D維向量μk,作為每個類的中心,我們所希望的是每個數據點與它最近的類中心的距離(這里采用平方和)最小。

      我們用數學語言來描述:

(1)

      rnk:rnk ∈ {0, 1},是一個二分變量,描述的是第n個數據點是否屬於第k類,例如:rnk=1,表示第n個數據點屬於k類;rnk=0,表示第n個數據點不屬於k類。

      J:為目標函數,描述的是每個數據點與它類中心的平方和。

      所以整個問題就變為我們希望找到最佳{rnk},{μk},使目標函數J最小。而我們通常是通過迭代程序,連續優化變量rnk,μk。在每一步迭代程序中,我們分成兩步來考慮:

     1 固定住類中心μk,也就是已知值,J是關於變量rnk的目標函數。我們要使J函數最小,只要讓第n個數據點屬於離當前最近的類中心所屬類就行。用數學語言來表達就是:

    

     2 固定住rnk,J是關於變量μk的目標函數,我們要是J函數最小,我們對函數J進行對μk的求導,令其等於0,即:

 

然后我們直接可以根據上面等式求解μk:

 

 從等式的數學意義來看,μk就是該類數據的均值,

       然后再將{rnk},{μk}進行下一次迭代,直至整個程序收斂停止。但是要注意我們在進行全局最小化目標函數J的過程中,往往會陷入局部收斂,至於k-means的收斂性我在就不具體討論了。最終求得的rnk,表達的也就是第n個數據點屬於哪一類,即完成了聚類操作。

      需要注意的是一開始我們並不知道這k類的類中心μk值,一般的我們采取隨機在樣本數據中選取k個數作為類的中心,每個數據點只能屬於一類,而不能屬於多個類。在一般情況下,我們橫量數據點與類中心的距離(或者說是數據點與類中心點的不相似性)是采用歐式距離,橫量的方法也可以采用其他方法,那么我們將k-means寫成一般化形式就為:

函數V()代表的就是數據點與類中心的距離。

      其實,如果我們更深入地理解k-means算法,其實應該算是mean-shift的一種特例。k-means算法在每次迭代過程中,類中心收斂的過程其實就是相當與mean-shift往高斯山峰自動移動的過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM