weighted Kernel k-means 加權核k均值算法理解及其實現(一)


那就從k-means開始吧

對於機器學習的新手小白來說,k-means算法應該都會接觸到吧。傳統的k-means算法是一個硬聚類(因為要指定k這個參數啦)算法。這里利用百度的解釋

它是數據點到原型的某種距離作為優化的目標函數,利用函數求極值的方法得到迭代運算的調整規則。K-means算法以歐式距離作為相似度測度,它是求對應某一初始聚類中心向量V最優分類,使得評價指標J最小。算法采用誤差平方和准則函數作為聚類准則函數。

看上去好難懂,實際上任務就是要聚類,然后將相關的點聚成一堆嘛。這里我們可以給出k-means的核心公式

這里可以看到,實際上就是計算每個樣本點簇中心的距離,然后判斷出到哪個簇中心距離最短,然后分給那個簇。然后下次迭代時,簇中心就按照新分配的點重新進行計算了,然后所有的點再同樣計算樣本點到簇中心的距離,重新分配到不同的簇中。所以這樣不斷迭代下去,就能夠收斂了,得到最后的聚類效果。

加上“核”?那就成了Kernel k-means

“核”是什么

核函數的方法已經被提出很久了,也得到了很多的推廣應用。很多算法參進了核函數,就變得有趣得多。核函數通常與SVM經常結合在一起進行使用。總的來說,核函數,就是將輸入空間,映射到高維的特征空間。然后再在高維的數據同看進行數據處理。這種映射的話,是非線性變換的,這也才能能夠將輸入空間映射出不同特征的高維空間。

當然,要給出這種非線性運算的確切算法,是很困難的。所以當我們的現實運算算法求解時候只用到了樣本點的內積運算時候,而在低維輸入空間中,我們有能夠得到某個函數K(x,x′),它恰好等於在高維空間中這個內積,即K( x, x′) =<φ( x) ⋅φ( x′) > 。

那么這樣就好辦了,只要我們每次計算樣本點投射到高維空間的值進行內積運算時,我們直接只需要使用函數K(x,x′),就可以得到。這就避免了我們將樣本點映射到高維空間的操作,減少了計算的難度和復雜度。所以每次進行運算,只需要運算K(x,x′)即可。(理解這一點很重要噢,為下面Kernel k-means做鋪墊)

那就給 k-means 加個“核”吧

核k-means,概括地來說,就是將數據點都投影到了一個高維的特征空間中(為啥要這么做呢,主要是突顯出不同樣本中的差異),然后再在這個高維的特征空間中,進行傳統的k-means聚類。主要的思想就是這么簡單,比起傳統普通的k-means就多了一個步核函數的操作。所以它的公式也與傳統k-means很相近:

這里所表示的,$a_i$是各個樣本點,而$\phi( )$函數,則是表示將樣本點映射至高維空間。而公式中的$m_c$,則是每個簇中的質心。
這個形式,對比起普通的k-means是不是很相近咧,同樣是求各個高維空間中的樣本特征(傳統k-means中是樣本點)與質心的距離,然后根據該樣本點到不同質心距離,選擇最小的(也就是說距離該樣本點最近)的簇心,進行分配(將該樣本點歸為這個簇)。

這就讓我們想起普通k-means的計算了,先算出各個簇具體簇心的具體值,然后就對所有樣本點重新計算到各個簇心的距離,然后進行重新分派。

然而,在kernel k-means中,計算方法普通k-means大有不同。首先,在上述的公式中,$\phi(a_i)$,這個我們是很難算出來的。因為之前說明核函數的時候提到,這個這種非線性的函數映射,我們很難去得到准確的函數算法;其次,對於每個簇的中心$m_c$,即使我們有簇內所有點的數據,但我們也還是是很難去准確描述這個中心的。

因此,我們要開始對這個公式進行改造啦。
首選,我們將
改寫成

這個變化很明顯是將這個平方公式進行展開,然后對$m_c$進行了替換,因為$m_c$實際上就是簇內所有數據所決定的。但是我們難以准確去表示而已,但是我們在算法等價上,這樣運算的結果還是與質心相同的。
所以我們最終要計算的公式也發生了變化。將原本的完全平方式,進行了展開。
觀察上面的完全平方展開式,我們可以發現:每一項中,需要使用到高維特征空間的值,都是在進行內積運算。因此符合我們之前所提到的,使用一個矩陣K函數,來代表高維特征空間中這兩個值的內積結果。
即$k<a_i,a_j>$等價於$\phi(a_j)\phi(a_i)$。這樣子,我們就根本不用管$\phi()$這個函數實際的運算定義是怎樣的了。只需要使用到這兩個特征進行相乘的結果。

來個小結

kernel k-means實際上公式上,就是將每個樣本進行一個投射到高維空間的處理,然后再將處理后的數據使用普通的k-means算法思想進行聚類。

在計算上的話,由於要映射到高維空間中,而且還要找出各個簇的中心。這些如果沒有能夠得到映射到高維空間的函數,是很難直接計算到的。但是我們可以觀察到,我們所要計算的公式,最終並不需要知道單獨的一個樣本點映射到高維空間的特征值,而是兩個高維空間特征值的內積。所以,我們只需要得到一個K矩陣,矩陣中每個元素都表示高維空間,這兩個樣本點映射成特征后,進行內積計算所得到的結果。所以這個矩陣,實際上就是一個核函數矩陣

那就再加上權重w來個weighted kernel k-means吧

看到這里,應該起碼對kernel k-means有個理解吧。然后我們還要在這個基礎,再加上一個權重w,也就是對每一個樣本點,都給出一個權重$w_j$,區分出不同樣本點的重要性。所以的話,我們的公式又增添了一點東西:

這里可以看到,公式中計算樣本高維空間特征到簇中心距離 的平方后,還乘以了一個權重$w_j$,對於不同的樣本點,其權重都可能不同。所以就只是簡單地乘多了一個權重,公式的計算方法跟 kernel k-means還是很相似的。
我們將平方項展開,然后將$m_c$項進行替換。然后我們的
得到以下結果:

如果我們再將其中的$\phi(a_i)\phi(a_i)$使用K的核函數矩陣($K(a_i,a_j)=phi(a_i)\phi(a_i)$)進行替換,則得到以下結果:

簡直完美,是吧。

下篇預告

時間比較緊,所以就先寫這些,關於算法的實現細節,以及復雜度分析。將於下篇介紹。
算法代碼已經推上了碼雲,有興趣的小伙伴可以clone下來把玩。
https://git.oschina.net/subaiDeng/Kernel-k-means
另外,寫這篇博客,是參考了正在查閱的一篇論文:
《Weighted Graph Cuts without Eigenvectors : A Multilevel Approach》
Yuqiang Guan and Brian Kulis
大家有興趣也可以去看看。

花絮

本人學淺才疏,若在書寫內容或者表達方式上存在錯誤,歡迎大家指出,也歡迎大家一起討論。


免責聲明!

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



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