1. 程式人生 > >主成分分析PCA & 奇異值分解SVD

主成分分析PCA & 奇異值分解SVD

一 特徵值和特徵向量

想了解PCA和SVD,首先要了解的一個概念就是特徵值和特徵向量。Ax = \lambda x        A是矩陣,x是向量、\lambda是數。如果滿足公式,則說\lambda是矩陣A的一個特徵值,非零向量x為矩陣A的屬於特徵值\lambda的特徵向量。矩陣A的特徵值和特徵向量可以寫成以下格式,請注意。

A =\left ( x1,x2,...,xn \right )\begin{bmatrix} \lambda 1&0&...&0 \\ 0&\lambda 2&...& 0\\ ...& ... & ... & \\ 0&0&...&\lambda n \end{bmatrix}\left ( x1,x2,...,xn \right )^{-1}

為什麼能把x叫做A矩陣的特徵向量呢,其實矩陣乘向量可以理解成對向量進行旋轉和拉長。當然並不是所有向量都可以被旋轉,矩陣無法旋轉的非零向量就是該矩陣的特徵向量!!

舉一個不恰當的例子,當你想描述一部手機的時候,你會描述電池、螢幕和品牌等等手機的特徵。現在輪到矩陣了,當你想描述一個矩陣的時候,不妨從它的特徵向量入手。(降維可以簡單理解成當矩陣的某個特徵向量對應的特徵值很小很小的時候,就可以拋棄這個特徵向量了。)

  手機 矩陣
特徵1 電池(3000毫安) x1(\lambda 1
特徵2 螢幕(4寸) x2(\lambda 2

二 PCA

圖解

如圖所示,資料分佈在一個橢圓內,每個點的座標為(X1,Y1)。可以發現數據在橢圓長軸上分佈的更開,代表在長軸上包含更多的資訊。降維的思想就是拋棄短軸上的資訊,保留下長軸的資訊,每個點的座標變為(aX1+bY1),二維資訊就被降到了一維。

 

數學推導

1.PCA和特徵值特徵向量的關係

存在一組資料A = \bigl(\begin{smallmatrix} x1 &x2 &... &xn \\ y1&y2 &... &yn \\ z1&z2 &... &zn \end{smallmatrix}\bigr)

,xyz代表3個特徵,n代表n個樣本。現在想降維,就是減少特徵的數量!

首先要明確一點,好的特徵應該是相互之間沒有相關關係的。例如,收入和可支配收入就是強相關的,兩者都作為特徵資訊可能就冗餘了。所以我們希望的降維之後的特徵之間沒有相互關係——即向量之間的協方差為0。

假設B是A轉變後的矩陣,B=UA。轉變後的B應該保證B的協方差矩陣為對角矩陣。

C^{_{B}}=BB^{^{T}}=UA(UA)^{_{T}}=UAA^{^{T}}U^{^{T}}=UC^{_{A}}U^{^{T}}=UC^{_{A}}U^{^{-1}}

公式只看頭尾就可以發現與特徵值特徵向量的公式關聯上了。上述公式中涉及到了以下幾個內容(選讀)

1.想要協方差矩陣等於BB^{^{T}},必須對B各列先減去均值

    完整的公式:E(X1-E(X1))E(X2-E(X2))=E(X1X2)-E(X1)E(X2)

2.協方差矩陣是實對稱矩陣,實對稱矩陣的不同特徵值相互正交,證明如下。

        \begin{matrix} Ax1=\lambda 1x1\\ x2^{^{T}}Ax1=\lambda 1x2^{^{T}}x1\\ \left (Ax2\right )^{T}x1=\lambda 1x2^{^{T}}x1\\ \lambda 2x2^{^{T}}x1=\lambda 1x2^{^{T}}x1\\ \left (\lambda 1-\lambda 2 \right )x2^{^{T}}x1=0 \end{matrix}

    因為兩個特徵值不相等,想要等式成立必須x1和x2正交

3.由上文知道,協方差矩陣C是一個是對稱矩陣,線上性代數上,實對稱矩陣有一系列非常好的性質。1)實對稱矩陣不同特徵值對應的特徵向量必然正交(已證明),2)設特徵向量中質為r,則必然存在r個線性無關的特徵向量對應於,因此可以將這r個特徵向量單位正交化。只有單位正交矩陣U的專置才可以等於U的逆。

 

2.特徵如何降維

B=UA,A維度是(3,n),U是由協方差矩陣的特徵向量組成的維度是(3,3),這樣計算出的B維度是(3,n),資料其實並沒有降維。降維的關鍵就在於U,如果U是一個(2,3)的矩陣,那B就變成了(2,n)。是不是我們只挑選協方差矩陣的兩個特徵向量組成U就可以了,是的!!特徵值按大小排序,選擇前2個特徵值的特徵向量組成U即可。特徵值的大小可以理解成包含資訊的多少,小的特徵值說明原矩陣在該特徵向量上並沒有多少資訊,可以捨棄。

 

3.PCA — python

import numpy as np
from sklearn.decomposition import PCA
M = [[2.5,2.4],[0.5,0.7],[2.2,2.9],[1.9,2.2],[3.1,3.0],[2.3,2.7],[2,1.6],[1,1.1],[1.5,1.6],[1.1,0.9]]
M = np.mat(M)
pca=PCA(n_components=1)     #載入PCA演算法,設定降維後主成分數目為2
reduced_x=pca.fit_transform(M)    #對樣本進行降維

二維資料成功被降為一維,見圖。注意該資料每行是一個樣本,與前期討論的每列一個樣本不一樣。

下面手動實現PCA

meanVals=np.mean(M,axis=0)  #對每一個特徵求均值,這裡是對列求
meanRemoved=M-meanVals  # 原始資料減去均值
covMat=np.cov(meanRemoved.T)    #計算協方差矩陣
c,d=np.linalg.eig(covMat)   #計算協方差矩陣的特徵值和特徵向量
reduced_x2 = meanRemoved*np.mat(d[:,1]).T   # 挑選最大特徵值對應的特徵向量,用於資料降維

挑選最大的特徵值對應的特徵向量(圖中紅框),用挑選出得特徵向量對減去均值的原始資料處理。可以發現最終結果和PCA方法的結果一模一樣。

參考了這個https://blog.csdn.net/xueli1991/article/details/69665887?locationNum=14&fps=1


三 SVD

1 SVD

方陣可以計算特徵值和特徵向量,那麼非方陣呢?非方陣可以利用奇異值分解提取特徵。

A_{m,n} = V_{m,m} *\begin{bmatrix} \lambda 1 & ... & 0\\ .. & ...&... \\ 0&... &\lambda n \\ ...& ... &...\\ 0& ...&0 \end{bmatrix}_{m,n}*U{_{n,n}}^{T}

V和U都代表什麼,UU分別是A*A.T和A.T*A的特徵向量,而特徵值\lambda就是A*A.T或A.T*A特徵值的開方。

A*A.T =( V*\sum*U^{-1})( U*\sum*V^{-1})=V*\sum*\sum*V^{-1}

A.T*A =( U*\sum*V^{-1})( V*\sum*U^{-1})=U*\sum*\sum*U^{-1}

2.如何使用

我們可以通過選擇前r個特徵值與特徵向量達到資訊壓縮,近似矩陣的目的。

A_{m,n}\approx V_{m,r}*\sum_{r,nr}*U_{r,n}^{T}

例如在圖片壓縮上,1080*960=的圖片在使用100特徵值的情況下,可以有效的壓縮成1080*100+100+100*960三個矩陣。

圖片來源於https://blog.csdn.net/bluecol/article/details/45971423

其實在潛在語義搜尋和推薦演算法中,SVD都大有用處。

3 SVD — python

利用Numpy自帶的方法進行奇異值分解

M = [[1,2,3,4],[5,6,7,8],[9,10,11,1],[2,3,4,5],[6,7,8,9]]
M = np.mat(M)
U, D,Vt = np.linalg.svd(M)

結果如下

下面分別計算A*A.T和A.T*A的特徵值和特徵向量,b,e,d分別對應U,D,V

a,b=np.linalg.eig(M*M.T)
c,d=np.linalg.eig(M.T*M)
e = np.power(c,1/2)


四 總結

 

  計算方法 目的 應用
PCA 首先計算特徵的協方差矩陣的特徵值和特徵向量,利用特徵值的大小對特徵向量進行篩選。最終用篩選出得特徵向量和原矩陣(減去均值後的)相乘,結果就是降維後的資料 對樣本的特徵進行重新組合,降維。 降維後的資料可以用於各種監督學習的演算法,減少計算量,提高計算結果的質量。
SVD   將非方陣矩陣拆分開 圖片壓縮、推薦系統和語義搜尋等等

 

簡單提一下另一個特徵降維的演算法——因子分析。PCA是想方設法將特徵組合,而因子分子想方設法將特徵拆分。例如語文,數學,物理,化學,生物,地理成績可能會被因子分析拆成記憶力能力、計算能力、寫作能力等等。對於因子分析,可以使用旋轉技術,使得因子更好的得到解釋,因此在解釋主成分方面因子分析更佔優勢,因子分析以後有機會再介紹吧。