PCA、SVD、ZCA白化理论与实现
簡介
在UFLDL中介紹了主成分分析這一塊的知識,而且當時學機器學習的時候,老師是將PCA和SVD聯系起來將的,同時UFLDL也講到了使用PCA做數據白化whitening處理,這個詞經常在論文里面看到。
國際慣例,參考博客:
UFLDL的PCA章節
PRML的第12.1 PCA章節
知乎深入理解PCA與SVD的關系
PCA and SVD explained with numpy
Relationship between SVD and PCA. How to use SVD to perform PCA?
百度百科正交投影
知乎正交投影
SVD(奇異值分解)小結
特征分解
協方差矩陣一定是滿秩的嗎?
PCA、ZCA白化
PCA理論
在PRML中給出了PCA的兩種定義:
- 數據在低維線性空間上的正交投影,這個線性空間被稱為主子空間,使得投影數據的方差被最大化
- 平均投影代價最小的線性投影。其中平均投影代價是數據點與投影點之間的平均平方距離。
如下圖就是將二維數據投影一維空間u1u_1u1?中
上圖中紅色的二維數據點被正交投影到主子空間(紫色的線),PCA的目的就是想讓投影后的數據(綠色點)具有最大的方差。 其中正交投影被神乎其神的說了一大堆理論,其實就是投影線垂直于投影面。
通常情況下,我們都是用第一個定義去理解PCA的,設每個樣本都有D個屬性,即D維向量,總共有N個樣本。
第一步將數據投影到D維向量u1u_1u1?上,一般來說我們設這個u1u_1u1?是D維空間中的方向向量:
x^=u1Tx\hat{x}=u_1^Tx x^=u1T?x
第二步求投影方差
1N{u1Txn?u1Txˉ}2=u1TSu1\frac{1}{N}\{u_1^Tx_n-u_1^T\bar{x}\}^2=u_1^TSu_1 N1?{u1T?xn??u1T?xˉ}2=u1T?Su1?
其中xˉ\bar{x}xˉ所有樣本均值xˉ=1N∑n=1Nxn\bar{x}=\frac{1}{N}\sum_{n=1}^Nx_nxˉ=N1?∑n=1N?xn?,注意不是每個樣本所有屬性求均值。
其中SSS是原數據集的協方差矩陣:
S=1N∑n=1N(xn?xˉ)(xn?xˉ)TS=\frac{1}{N}\sum_{n=1}^N(x_n-\bar{x})(x_n-\bar{x})^T S=N1?n=1∑N?(xn??xˉ)(xn??xˉ)T
【注】協方差反映的是屬性與屬性之間的關系,而非樣本與樣本之間的關系。
第三步約束
上面我們經常約束u1u_1u1?是方向向量,那么
u1Tu1=1u_1^Tu_1=1 u1T?u1?=1
結合這個約束以及為了讓方差最大化的目標,可以利用拉格朗日乘數法建立下式:
u1TSu1+λ1(1?u1Tu1)u_1^TSu_1+\lambda_1(1-u_1^Tu_1) u1T?Su1?+λ1?(1?u1T?u1?)
當上式導數為零時,駐點滿足
Su1=λ1u1Su_1=\lambda_1u_1 Su1?=λ1?u1?
很容易發現u1u_1u1?一定是SSS的特征向量,同時也能發現當λ1\lambda_1λ1?越大,方差越大。所以最大特征值對應的特征向量為第一主成分。同理就能利用特征分解的方法求解到第二、三、…主分量。
綜上,可以得到PCA的一般步驟為:
-
整理原始矩陣Xn×mX_{n \times m}Xn×m? ,代表n個樣本,每個樣本維度為m
-
求原始矩陣Xn×mX_{n \times m}Xn×m?的協防差陣Sm×m=Cov(X)S_{m\times m}=Cov(X)Sm×m?=Cov(X)
-
求解協防差陣的特征值和特征向量。
-
選取最大的K(人為給定)個特征值所對應的特征向量組成構成矩陣Wm×kW_{m\times k}Wm×k?
-
直接進行矩陣計算,就得到了降維后的數據
Zn×k=Xn×mWm×kZ_{n\times k} = X_{n\times m }W_{m\times k } Zn×k?=Xn×m?Wm×k?
SVD 理論
一般來說實對稱矩陣可以被分解為A=Q∑QTA=Q\sum Q^TA=Q∑QT的形式,其中QQQ為標準正交矩陣,∑\sum∑對角陣,對角陣上的元素λi\lambda_iλi?是矩陣A的特征值,對應的特征向量是QiQ_iQi?
那么如果矩陣AAA為非實對稱矩陣的時候,有沒有類似的
A=UΣVTA=U\Sigma V^T A=UΣVT
奇異值分解(singular value decomposition,SVD)做的就是這件事。在SVD的官方術語中,U是(n,n)(n,n)(n,n)維的方陣稱為左奇異向量;Σ\SigmaΣ是(n,m)(n,m)(n,m)的對角陣,對角線上的元素稱為奇異值;V 是(m,m)(m,m)(m,m)維度的方陣稱為右奇異向量,并且U和V均為單位正交矩陣,UUT=1UU^T=1UUT=1且VVT=1VV^T=1VVT=1
求解方法就是利用AATAA^TAAT與ATAA^TAATA都是對稱陣的特性,得到:
AAT=UΣΣTUTATA=VΣTΣVTAA^T=U\Sigma \Sigma ^T U^T \\ A^TA=V\Sigma^T\Sigma V^T AAT=UΣΣTUTATA=VΣTΣVT
這樣就能求解出U、Σ\SigmaΣ、V。
這篇文章里面有例子。
PCA和SVD的關系
摘自此處,通過協方差矩陣的求解方法建立聯系:
在SVD中:
S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V?1S=A^TX =V\Sigma U^T U\Sigma V^T =V\Sigma ^2V^T =V\Sigma^2V^{-1} S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V?1
而在PCA中:
S=u1λ1u1?1S=u_1\lambda_1u_1^{-1} S=u1?λ1?u1?1?
所以:
λ=Σ2u=V\lambda=\Sigma^2\\ u=V λ=Σ2u=V
這一點可以通過代碼驗證:
使用PCA對mnist數據集降維
其實在這里遇到一個問題:使用eig對手寫數字數據集的協方差矩陣求解特征值時得到了復數特征值和特征向量,這一點暫時沒弄明白,但是使用svd可以得到正常的特征值和特征向量。
sklearn中的pca
from sklearn.decomposition import PCA pca = PCA(n_components=2) result = pca.fit_transform(data)得到結果圖
numpy手撕PCA
def PCA_numpy(X):#零均值化print(X.shape)X=X-X.mean(axis=0)## 使用特征值和特征向量#協方差矩陣#cov_X = np.cov(X,rowvar=0)#每一列一個特征#eig_val,eig_vec = np.linalg.eig(cov_X) #出現復數了##使用svdU,eig_val,eig_vec = np.linalg.svd(X)#選兩個最大的idx = np.argsort(-eig_val)temp_M=[]for i in range(2):temp_M.append(eig_vec[idx[i]])temp_M = np.array(temp_M).Tresult = np.dot(X,temp_M)return result同樣得到結果值
這個圖里面每個顏色代表手寫數字數據集里面的0-9數字。
ZCA白化
在UFLDL中還介紹了基于PCA的白化(whitening或者球化sphering)方法,白化的目標有兩個:
- 特征之間具有盡量少的相關性
- 特征具有相同的方差
針對第一個目標,前面的使用PCA降維x=uTxx=u^Txx=uTx已經達到了效果。
針對第二個目標,讓每個輸入特征值都具有單位方差(unit variance),只需要除以特征值的開根號即可:
xpcai=xiλix_{pcai}=\frac{x_i}{\sqrt{\lambda _i}} xpcai?=λi??xi??
降維數據的第i列對應第i個特征值。這時候,數據的協方差就是單位陣,這就是所說的PCA白化(數據的不同成分無聯系并且具有單位方差)。
但是我們第二個目標其實是具有相同方差,而具有相同的單位方差并不是唯一的一個情況,也可能是具有相同的非單位方差。在ZCA白化中,又對pca白化做了一次左乘:
xzca=uxpcax_{zca}=ux_{pca} xzca?=uxpca?
這樣雖然把方差不再是1了,但是變換后的數據更加接近原始數據。
有一點需要注意:PCA可以用于降維(取前面一部分主成分),但是zca必須保持原有的維度不變,zca只做去相關,不做降維。
后記
這個學習筆記主要是針對機器學習里面常見的降維方法PCA進行剖析和逐步實現,具體代碼包括手寫數字的讀取和最終降維圖的畫圖,請參看公眾號簡介中的github網址。后續將持續更新其它機器學習理論和算法,敬請關注:
總結
以上是生活随笔為你收集整理的PCA、SVD、ZCA白化理论与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow2安装时候的一个dl
- 下一篇: PHP二维数组去重(指定键名)