1. Kmeans++
Kmeans 中對聚類中心的初始化比較敏感,不同的初始值會帶來不同的聚類結果,這是因爲 Kmeans 僅僅是對目標函數求近似最優解,不能保證得到全局最優解。
在常規的 Kmeans 中,聚類中心的初始化都採用隨機初始化的方式,這樣會存在一個問題:如果數據在某個部分較密集,那麼產生的隨機數會以更高的概率靠近這些數據。
例如,假設輸入數據爲:
如下圖所示:
如果隨機初始化兩個聚類中心,那這兩個聚類中心都會以更高的概率靠近 1.0 附近的數據,也就是說,很可能出現:隨機初始化的兩個聚類中心都聚類 1.0 附近的數據較近,這樣會導致聚類效果不好。
爲了解決上述問題,David Arthur 提出了 Kmeans++ 算法,該方法可以有效的產生好的聚類中心,過程如下:
1.從輸入的數據點集合中隨機選擇一個點作爲第一個聚類中心
2.對於數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離
3.選擇一個新的數據點作爲新的聚類中心,選擇的原則是:較大的點,被選取作爲聚類中心的概率較大
4.重複2和3直到k個聚類中心被選出來
5.利用這k個初始的聚類中心來運行標準的k-means算法
其中,第 3 步的實現爲,先取一個能落在中的隨機值 ,然後用,直到其,此時的點就是下一個“種子點”。
假設第一個聚類中心爲 1,那麼,所有輸入數據與聚類中心的距離 D爲:
對 求前綴和,得到 ,爲:
如下圖所示:
此時產生一個隨機數 ,並乘以 ,那麼,該數大於等於 0.85 的概率會非常大,假設爲 4,那麼第10 個數,4.95 是第一個大於 4 的數,就把輸入數據中的第 10 個,也就是 3.1 作爲新的聚類中心。
上述過程的意義爲:讓新的聚類中心以更大的概率遠離已有的聚類中心,以避免聚類中心以高概率分佈在數據密集的部份。
2. 字典學習
參考《Learning Feature Representations with K-means》。
2.1 第一步:圖像分塊,作爲樣本
從輸入圖像中截取圖像塊(可以有重疊),塊的大小可以爲8x8,16x16等,塊的大小決定了樣本的維度,爲了得到更好的字典,塊越大,需要的訓練樣本越多。對於 16x16 的塊,100 000 個樣本足以。然後把每個塊拉成一維,並把所有的樣本合併,組成一個矩陣:
其中,m 爲樣本的維度,也就是圖像塊的大小,n 爲樣本的個數。
2.2 輸入歸一化
一般會對數據進行歸一化,歸一化的過程如下式所示:
其中,mean 表示 的均值, 表示方差。對於圖像數據,範圍在[0-255], 可以取10,
2.3 輸入白化
白化是爲了降低輸入冗餘性,使輸入樣本具有如下特性:
- 特徵之間相關性低
- 所有特徵具有相同的協方差
也就是對輸入樣本 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》