聚類與稀疏表示


 

1.聚類與稀疏表示的關系

  聚類,也可以稱為向量量化(vector quantization,VQ),可以看作稀疏表示的一種特殊情況,反過來,稀疏表示則可以當成廣義的聚類。在聚類中,每個樣本(信號)都被表示成與之最近的碼字(codeword),且系數為1;gain-shape VQ的系數可以使任意的,但是表示的codeword的數目也是一個,即也只能用一個codeword表示樣本;而稀疏表示則是用原子字典中原子的線性組合來表示樣本,即原子個數是任意的(但是是有限制的,否則稀疏表示沒有意義),且系數也是任意的。當用於表示樣本的原子數目為1時,則稀疏表示相當於gain-shape VQ,若原子的系數也為1,此時,稀疏表示就相當於聚類。

 

2.K-means算法

  構造聚類碼書(codebook)最常用的算法是K-means算法,K-means算法的目的是求得一個codebook使得逼近誤差最小,即

       

其中,是樣本集合,是由codeword組成的codebook矩陣,是系數矩陣,是自然基。

  K-means算法構造聚類codebook時,首先初始化一個隨機的codebook,即從樣本集中隨機抽取K個樣本作為codebook,然后根據最近鄰分配將每個樣本分配到與之最近的codeword,聚成K個類,每個codeword就是一個類的聚簇中心;接着,對每個類中的樣本坐標取平均值,作為新的codeword,從而完成對codebook的更新。也就是說,K-means算法構造聚類codebook是一個迭代更新的過程,每次迭代主要的步驟有:

1)稀疏編碼,即固定codebook矩陣C,求樣本集Y的系數矩陣X;

2)更新codebook,即對每個類的樣本坐標取平均,求得新的codeword;

K-means算法求聚類codebook的流程圖,如圖1所示,

圖1 K-means算法求聚類碼書流程圖

  可以保證的是,在每次迭代中MSE值減小或者沒有變化,,算法保證了MSE的值是單調減少的,且至少收斂到局部最優值。

 

3.K-SVD算法

  構造稀疏表示過完備字典的算法有最大似然估計(maximum likelihood method)、最優方向算法(method of optimal directions,MOD)、最大后驗概率(maximum a-posteriori probability)、聯合標准正交基(unions of orthonormal bases)以及K-SVD等,這些算法都可以看成是廣義的K-means算法。K-SVD由於其有效的稀疏編碼以及高斯·賽德爾似的加速字典更新過程,使得K-SVD算法非常高效。K-SVD與前幾種廣義K-means算法明顯不同之處是,K-SVD是逐列更新字典的,一次只更新字典的一列,除了要更新的列之外,固定字典中的其他列,而且更新列的同時還更新相應的系數,這使得K-SVD收斂得更快。在某種意義上,K-SVD是K-means更直接的推廣,因為K-SVD和K-means一樣,都是逐列更新的。還有人建議省去稀疏編碼階段,只保留更新字典階段,但是這是不可取的,因為如果只有更新字典的步驟,表示系數的支撐集不變,算法必然陷入局部最優。

  與K-means算法類似,K-SVD算法的目的也是找到一個原子字典使得逼近誤差最小,K-SVD算法的目標函數為:

       

  K-SVD算法跟K-means算法一樣,每次迭代只有兩個主要的步驟:

1)稀疏編碼,固定字典D,求系數矩陣X;

2)逐列更新字典的列以及相應的系數;

在第一個步驟中,相當於對每個樣本應用某種追蹤算法,求得表示系數的逼近,因為在實際中,一般很難求得全局最優解;在第二個步驟中,將懲罰項中的乘積DX分解為K個秩為1矩陣的和,進一步地,只保留要更新的字典原子的那一項,即

      

其中,為沒有的情況下所有樣本的誤差矩陣。

  至此,可以對進行SVD分解,得到的近似值,從而更新字典的原子以及相應的系數。但是,如果直接對進行SVD分解,得到的的近似值的項全部是非零的,這樣的話,不滿足目標函數(式(2))稀疏度的限制,從而需要對做一定的處理后再進行SVD分解。

  假設需要當前更新原子表示的樣本為,用表示樣本的索引,表示集合的勢,即,.取中與相對應的列組成新的誤差矩陣,則相當於誤差矩陣右乘相應的變換矩陣,其中,的矩陣,除了項為1外,其余的項都為0.對系數右乘效果是一樣的,只保留原子表示樣本的系數,此時,懲罰項變為

      

這樣做能保證SVD分解后得到的系數與原來的系數有相同的支撐集。對進行SVD分解,即,將U的第一列作為新的原子,V的第一列與相乘作為新的,對每個原子進行上述的過程實現字典的更新。K-SVD算法求稀疏表示字典的流程圖如圖2所示,

圖2 K-SVD求稀疏表示字典流程圖

 

4.小結

  聚類只使用一個codeword來表示樣本且系數為1,而稀疏表示則使用原子的線性組合來表示樣本,可以將聚類看成是稀疏表示的一種特殊情況,而把稀疏表示當成是廣義的聚類。聚類中是采用K-means算法來求得聚類所用的codebook的,由於二者直接的相似性,我們自然想到了用類似K-means的算法來求得稀疏表示所用的原字字典,從而有了K-SVD算法。聚類與稀疏表示的比較如圖3所示,

圖3 聚類與稀疏表示的比較


免責聲明!

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



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