SVD與PCA,奇異值分解與主成分分析的比較

一般來說,想要獲得低維的子空間,最簡單的是對原始的高維空間進行線性變換(當然了,非線性也是可以的,如加入核函數,比較著名的就是KPCA)。SVD和PCA呢,都實現了降維與重構,但是呢,思路不太一樣,老師課上提了一次,以前看的迷迷糊糊的,這次下定決心,怎麼都要搞清楚這兩個概念。
SVD(singular value decomposition),線性代數裏也叫作奇異值分解,可以用來計算矩陣的特徵值(奇異值)和特徵向量(我知道表達不準確,但我也不想知道正確的說法)。
SVD大多數情況下用來提取一個矩陣的主特徵值,可以用於圖像的壓縮和去噪。舉個例子,將一個納木錯大犛牛圖像奇異值分解,

Im=imread('niu.jpg');
figure(1);
Im=rgb2gray(Im);
imshow(Im,[]);
set(gca,'position',[0 0 1 1])
[m n]=size(Im);
Im=double(Im);
r=rank(Im);
[s v d]=svd(Im);
Im2=s(:,:)*v(:,1:100)*d(:,1:100)';
figure(2);
imshow(mat2gray(Im2));
imwrite(mat2gray(Im2),'1.jpg')
set(gca,'position',[0 0 1 1])
原圖:

原圖像共有1936個奇異值,這裏選用100個奇異值重建:


奇異值分解的公式爲


矩陣sigma中的最大的特徵值所對應的U和V中的列向量和行向量,也就包含了圖像中最多的信息。而且這種信息應該是低頻的信息,特徵值越大,表明原矩陣中的列向量的在該方向上的投影長度越大,也就是相關性越大,通過小的特徵值重構出來的成分往往是高頻噪聲,因爲在這些方向上,原矩陣中各個向量的相關性很小。

爲什麼說這些,其實我就想說,SVD也是一種實用的降維手段。下面說說是具體怎麼降維的,降得是什麼維?

因爲正常我們會把每一個樣本排成一個列向量,原始的矩陣C(m*n)的行數指的樣本的維數m,列數就是樣本的個數n,,現實生活中m<<n,因此rank(C)<=m。一個m維的向量,使用m個基向量就可以將其完備的表示出來,SVD就是尋找這些基向量。我們進行奇異值分解後,注意U的列向量和V的行向量都是單位向量,這不是明擺着的基向量麼。將U中的列向量看做基,這些基地原矩陣C的列向量的基底,並且對於C中所有的列向量來說,這些矩陣在基向量u1上的投影長度最長,也就是說相關度最高,因爲u1向量對應的sigma值最大,因此可以看做具體請看下圖。


看完上面的圖,有沒有疑問,有就對了,我也是剛想到的一個問題,就拿c1向量來說,把他span成基向量的表達方式時,每個基向量前面的係數不僅有sigma,還有v1(1)等係數,經過這些係數的加權之後,那u1這個主向量還能保證嗎?

答:可以保證,給大家一個思路,v*向量是單位向量,剩下來的大家應該知道了吧。

PCA(Principal Component Analysis)主成分分析最常用的一種降維方法,出發點是對於正交屬性空間中的樣本點,如何使用一個超平面對所有的樣本進行恰當的表達。PCA在CSDN上已經被講了n次了,有就不詳細講了,就理一理思路,大家感興趣可以搜其他大牛的博客看看。一般來說,有兩個出發點,1)樣本點到這個超平面的距離足夠近(重構性,最大程度的代表樣本點),2)樣本點在這個超平面上的投影儘可能分開(可分性,樣本點在降維空間內可以區分)下面使用第二個指導思想簡單的推導一下


利用PCA進行降維的過程中,我們只需要按照特徵值的大小順序,將原來的樣本挨個往特徵向量投影即可,至於選幾個向量,一般來說需要調參。

Andrew ng教程中又提及了白化(whiten)的概念,目的就是爲了把特徵向量的特徵值變成1,這樣就消除了主方向的影響,具體可以看 http://ufldl.stanford.edu/wiki/index.php/Whitening。

參考

《機器學習》周志華

《The Matrix Cook book》 version:November 15,2012(強烈推薦的手頭工具書,涉及矩陣的求導之類的直接套公式就行)




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