Kmeans++及字典學習

1. Kmeans++

Kmeans 中對聚類中心的初始化比較敏感,不同的初始值會帶來不同的聚類結果,這是因爲 Kmeans 僅僅是對目標函數求近似最優解,不能保證得到全局最優解。

在常規的 Kmeans 中,聚類中心的初始化都採用隨機初始化的方式,這樣會存在一個問題:如果數據在某個部分較密集,那麼產生的隨機數會以更高的概率靠近這些數據。

例如,假設輸入數據爲:

[0.8,0.85,0.9,0.95,1,1.05,1.1,1.2,3.0,3.1,3.2][0.8, 0.85, 0.9, 0.95, 1,1.05, 1.1, 1.2, 3.0, 3.1, 3.2],

如下圖所示:

這裏寫圖片描述

如果隨機初始化兩個聚類中心,那這兩個聚類中心都會以更高的概率靠近 1.0 附近的數據,也就是說,很可能出現:隨機初始化的兩個聚類中心都聚類 1.0 附近的數據較近,這樣會導致聚類效果不好。

爲了解決上述問題,David Arthur 提出了 Kmeans++ 算法,該方法可以有效的產生好的聚類中心,過程如下:

1.從輸入的數據點集合中隨機選擇一個點作爲第一個聚類中心

2.對於數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)D(x)

3.選擇一個新的數據點作爲新的聚類中心,選擇的原則是:D(x)D(x)較大的點,被選取作爲聚類中心的概率較大

4.重複2和3直到k個聚類中心被選出來

5.利用這k個初始的聚類中心來運行標準的k-means算法


其中,第 3 步的實現爲,先取一個能落在Sum(D(x))Sum(D(x))中的隨機值 randomrandom,然後用random=D(x)random -= D(x),直到其<=0<=0,此時的點就是下一個“種子點”。

假設第一個聚類中心爲 1,那麼,所有輸入數據與聚類中心的距離 D爲:

D(x)=[0.2,0.15,0.1,0.05,0,0.05,0.1,0.2,2.,2.1,2.2]D(x) = [0.2, 0.15, 0.1, 0.05, 0, 0.05, 0.1, 0.2, 2., 2.1, 2.2]

DD 求前綴和,得到 D1D_1D1D_1爲:

D1=[0.2,0.35,0.45,0.5,0.5,0.55,0.65,0.85,2.85,4.95,7.15]D_1 = [0.2, 0.35, 0.45, 0.5, 0.5, 0.55, 0.65, 0.85, 2.85, 4.95, 7.15]

如下圖所示:

這裏寫圖片描述

此時產生一個隨機數 random(0,1)random∈(0, 1),並乘以 D1(end)=7.15D_1(end) = 7.15,那麼,該數大於等於 0.85 的概率會非常大,假設爲 4,那麼第10 個數,4.95 是第一個大於 4 的數,就把輸入數據中的第 10 個,也就是 3.1 作爲新的聚類中心。

上述過程的意義爲:讓新的聚類中心以更大的概率遠離已有的聚類中心,以避免聚類中心以高概率分佈在數據密集的部份。

2. 字典學習

參考《Learning Feature Representations with K-means》。

2.1 第一步:圖像分塊,作爲樣本

從輸入圖像中截取圖像塊(可以有重疊),塊的大小可以爲8x8,16x16等,塊的大小決定了樣本的維度,爲了得到更好的字典,塊越大,需要的訓練樣本越多。對於 16x16 的塊,100 000 個樣本足以。然後把每個塊拉成一維,並把所有的樣本合併,組成一個矩陣:

X=[x1,x2,xi,...,xn]X=[x_1, x_2, x_i, ..., x_n]

其中xi=[xi1,xi2,...,xim]Tx_i = [x_{i1}, x_{i2}, ..., x_{im}]^T,m 爲樣本的維度,也就是圖像塊的大小,n 爲樣本的個數。

2.2 輸入歸一化

一般會對數據進行歸一化,歸一化的過程如下式所示:

x(i)=x~(i)mean(x~(i))var(x~(i))+ε{x^{(i)}} = \frac{{{{\tilde x}^{(i)}} - mean({{\tilde x}^{(i)}})}}{{\sqrt {{\mathop{\rm var}} ({{\tilde x}^{(i)}}) + \varepsilon } }}

其中,mean 表示x~(i){{\tilde x}^{(i)}} 的均值,varvar 表示x~(i){{\tilde x}^{(i)}}方差。對於圖像數據,範圍在[0-255],ε\varepsilon 可以取10,

2.3 輸入白化

白化是爲了降低輸入冗餘性,使輸入樣本具有如下特性:

  1. 特徵之間相關性低
  2. 所有特徵具有相同的協方差

也就是對輸入樣本 X 進行一種變換,使得到新的 X 滿足 X 的協方差矩陣爲單位陣。

具體可以通過如下操作完成:

    [V, D] = eig(cov(x)),也就是說 VDV' = cov(x)
    x = V(D + epsilon*I)^V'x

對於 16x16 的圖像塊,epsilon可以取 0.01,對於 8x8 的圖像塊,epsilon可以取 0.1。

2.4 聚類

以新的 X 作爲輸入樣本進行 Kmeans 聚類。

2.5 結果

以“leaves”圖作爲輸入圖像,如下所示:

這裏寫圖片描述

未歸一化和白化,直接進行聚類的結果如下所示:

這裏寫圖片描述

先歸一化和白化,然後進行聚類的結果如下所示:

這裏寫圖片描述

圖像中有些字典很像噪聲,這是因爲這些字典類別中的樣本數較少。

3.圖像分割

首先對彩色圖像進行顏色空間的轉換,從 RGB 通道轉爲 Lab 顏色空間,其中,L表示亮度(Luminosity),a表示從洋紅色至綠色的範圍,b表示從黃色至藍色的範圍。在此我們以 ab 通道數據作爲一個樣本,也就是說樣本的維度爲2,樣本的個數就是圖像的像素個數。

然後利用 Kmeans 對數據樣本進行聚類和標記,每一種類別代表一種分割的區域。

輸入圖像:

這裏寫圖片描述

分割後的輸出圖像:

這裏寫圖片描述

4. 參考

《視覺機器學習20講》

《Learning Feature Representations with K-means》

zouxy09的專欄

5. 代碼

GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章