pca各个向量之间的相关度_PCA主成分分析
降維就是一種對高維度特征數(shù)據(jù)預(yù)處理方法。降維是將高維度的數(shù)據(jù)保留下最重要的一些特征,去除噪聲和不重要的特征,從而實現(xiàn)提升數(shù)據(jù)處理速度的目的。降維的算法有很多,比如奇異值分解(SVD)、主成分分析(PCA)、因子分析(FA)、獨立成分分析(ICA)。
1.概念
PCA(Principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數(shù)據(jù)降維算法。PCA的問題其實是一個基的變換,使得變換后的數(shù)據(jù)有著最大的方差。方差的大小描述的是一個變量的信息量,我們在講一個東西的穩(wěn)定性的時候,往往說要減小方差,如果一個模型的方差很大,那就說明模型不穩(wěn)定了。但是對于我們用于機器學習的數(shù)據(jù)(主要是訓(xùn)練數(shù)據(jù)),方差大才有意義,不然輸入的數(shù)據(jù)都是同一個點,那方差就為0了,這樣輸入的多個數(shù)據(jù)就等同于一個數(shù)據(jù)了。
PCA的主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎(chǔ)上重新構(gòu)造出來的k維特征。PCA的工作就是從原始的空間中順序地找一組相互正交的坐標軸,新的坐標軸的選擇與數(shù)據(jù)本身是密切相關(guān)的。其中,第一個新坐標軸選擇是原始數(shù)據(jù)中方差最大的方向,第二個新坐標軸選取是與第一個坐標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的坐標軸。通過這種方式獲得的新的坐標軸,我們發(fā)現(xiàn),大部分方差都包含在前面k個坐標軸中,后面的坐標軸所含的方差幾乎為0。于是,我們可以忽略余下的坐標軸,只保留前面k個含有絕大部分方差的坐標軸。事實上,這相當于只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實現(xiàn)對數(shù)據(jù)特征的降維處理。
如何得到這些包含最大差異性的主成分方向呢?通過計算數(shù)據(jù)矩陣的協(xié)方差矩陣,然后得到協(xié)方差矩陣的特征值特征向量,選擇特征值最大(即方差最大)的k個特征所對應(yīng)的特征向量組成的矩陣。這樣就可以將數(shù)據(jù)矩陣轉(zhuǎn)換到新的空間當中,實現(xiàn)數(shù)據(jù)特征的降維。
由于得到協(xié)方差矩陣的特征值特征向量有兩種方法:特征值分解協(xié)方差矩陣、奇異值分解協(xié)方差矩陣,所以PCA算法有兩種實現(xiàn)方法:基于特征值分解協(xié)方差矩陣實現(xiàn)PCA算法、基于SVD分解協(xié)方差矩陣實現(xiàn)PCA算法。
2.那么協(xié)方差矩陣到底是什么?
我們都知道對于樣本來說:
樣本均值:
樣本標準差:樣本方差:
很顯然,均值描述的是樣本集合的中間點,它告訴我們的信息是很有限的,而標準差給我們描述的則是樣本集合的各個樣本點到均值的距離之平均。以這兩個集合為例,[0,8,12,20]和[8,9,11,12],兩個集合的均值都是10,但顯然兩個集合差別是很大的,計算兩者的標準差,前者是8.3,后者是1.8,顯然后者較為集中,故其標準差小一些,標準差描述的就是這種“散布度”。之所以除以n-1而不是除以n,是因為這樣能使我們以較小的樣本集更好的逼近總體的標準差,即統(tǒng)計上所謂的“無偏估計”。而方差則僅僅是標準差的平方。
注意到,標準差和方差一般是用來描述一維數(shù)據(jù)的,方差的計算公式是針對一維特征,即針對同一特征不同樣本的取值來進行計算得到。但現(xiàn)實生活我們常常遇到含有多維數(shù)據(jù)的數(shù)據(jù)集。面對這樣的數(shù)據(jù)集,我們當然可以按照每一維獨立的計算其方差,但是通常我們還想了解更多,比如,一個男孩子的猥瑣程度跟他受女孩子歡迎程度是否存在一些聯(lián)系啊,嘿嘿~協(xié)方差就是這樣一種用來度量兩個隨機變量關(guān)系的統(tǒng)計量,我們可以仿照方差的定義:
來度量各個維度偏離其均值的程度,協(xié)方差可以這么來定義:
協(xié)方差的結(jié)果有什么意義呢?如果結(jié)果為正值,則說明兩者是正相關(guān)的(從協(xié)方差可以引出“相關(guān)系數(shù)”的定義),也就是說一個人越猥瑣就越受女孩子歡迎,嘿嘿,那必須的~結(jié)果為負值就說明負相關(guān)的,越猥瑣女孩子越討厭,可能嗎?協(xié)方差為0,說明X和Y相關(guān)性為0,相關(guān)性為0并不一定相互獨立,相互獨立協(xié)方差(相關(guān)性)一定為零。
從協(xié)方差的定義上我們也可以看出一些顯而易見的性質(zhì),如:
所以協(xié)方差多了就是協(xié)方差矩陣,上面協(xié)方差也只能處理二維問題,那維數(shù)多了自然就需要計算多個協(xié)方差。舉一個簡單的三維的例子,假設(shè)數(shù)據(jù)集有三個維度,則協(xié)方差矩陣為:
可見,協(xié)方差矩陣是一個對稱的矩陣,而且對角線是各個維度上的方差。必須要明確一點,協(xié)方差矩陣計算的是不同維度之間的協(xié)方差,而不是不同樣本之間的協(xié)方差。補充:計算協(xié)方差需要計算均值,那是按行計算均值還是按列呢?協(xié)方差矩陣是計算不同維度間的協(xié)方差,要時刻牢記這一點。樣本矩陣的每行是一個樣本,每列為一個維度,所以要按列計算均值。
散布矩陣又稱散度矩陣,將協(xié)方差矩陣乘以系數(shù)(n-1)就得到了散布矩陣,所有散布矩陣與協(xié)方差矩陣矩陣的作用是一樣的,它們的特征值和特征向量也是一樣的。這里值得注意的是,散度矩陣是SVD奇異值分解的一步,因此PCA和SVD是有很大聯(lián)系,后面補充。理解了協(xié)方差矩陣也就理解了散布矩陣,它們只有一個系數(shù)只差而已。
3.PCA算法有兩種實現(xiàn)方法
先了解一些基礎(chǔ):(1)特征值與特征向量
如果一個向量v是矩陣A的特征向量,將一定可以表示成下面的形式:
其中,λ是特征向量v對應(yīng)的特征值,一個矩陣的一組特征向量是一組正交向量。
(2) 特征值分解矩陣
對于矩陣A,有一組特征向量v,將這組向量進行正交化單位化,就能得到一組正交單位向量。特征值分解,就是將矩陣A分解為如下式:
其中,Q是矩陣A的特征向量組成的矩陣,
則是一個對角陣,對角線上的元素就是特征值。(3)SVD分解矩陣原理
奇異值分解是一個能適用于任意矩陣的一種分解的方法,對于任意矩陣A總是存在一個奇異值分解:
假設(shè)A是一個m*n的矩陣,那么得到的U是一個m*m的方陣,U里面的正交向量被稱為左奇異向量。Σ是一個m*n的矩陣,Σ除了對角線其它元素都為0,對角線上的元素稱為奇異值。
是v的轉(zhuǎn)置矩陣,是一個n*n的矩陣,它里面的正交向量被稱為右奇異值向量。而且一般來講,我們會將Σ上的值按從大到小的順序排列。SVD分解矩陣A的步驟:
(1)求
的特征值和特征向量,用單位化的特征向量構(gòu)成 U。(2) 求
的特征值和特征向量,用單位化的特征向量構(gòu)成 V。(3) 將
或者 的特征值求平方根,然后構(gòu)成 Σ。(1) 基于特征值分解協(xié)方差矩陣實現(xiàn)PCA算法
輸入:數(shù)據(jù)集
,需要降到k維。總結(jié):關(guān)于這一部分為什么用
,這里面含有很復(fù)雜的線性代數(shù)理論推導(dǎo),想了解具體細節(jié)的可以看下面這篇文章。CodingLabs - PCA的數(shù)學原理關(guān)于為什么用特征值分解矩陣,是因為
是方陣,能很輕松的求出特征值與特征向量。當然,用奇異值分解也可以,是求特征值與特征向量的另一種方法。舉例:
以
為例,我們用PCA方法將這兩行數(shù)據(jù)降到一行。3.求協(xié)方差矩陣的特征值與特征向量。求解后的特征值為:
其對應(yīng)的特征向量分別是:
其中對應(yīng)的特征向量分別是一個通解,c1和c2可取任意實數(shù)。那么標準化后的特征向量為:
因此我們的矩陣P是:
可以驗證協(xié)方差矩陣C的對角化:
最后我們用P的第一行乘以數(shù)據(jù)矩陣,就得到了降維后的表示:
降維投影結(jié)果如下圖:
數(shù)據(jù)矩陣X降維投影結(jié)果注意:如果我們通過特征值分解協(xié)方差矩陣,那么我們只能得到一個方向的PCA降維。這個方向就是對數(shù)據(jù)矩陣X從行(或列)方向上壓縮降維。
(2) 基于SVD分解協(xié)方差矩陣實現(xiàn)PCA算法
還是輸入:數(shù)據(jù)集
,需要降到k維。在PCA降維中,我們需要找到樣本協(xié)方差矩陣
的最大k個特征向量,然后用這最大的k個特征向量組成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協(xié)方差矩陣 ,當樣本數(shù)多、樣本特征數(shù)也多的時候,這個計算還是很大的。當我們用到SVD分解協(xié)方差矩陣的時候,SVD有兩個好處:1) 有一些SVD的實現(xiàn)算法可以先不求出協(xié)方差矩陣
也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解而是通過SVD來完成,這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA算法的背后真正的實現(xiàn)就是用的SVD,而不是特征值分解。2)注意到PCA僅僅使用了我們SVD的左奇異矩陣,沒有使用到右奇異值矩陣,那么右奇異值矩陣有什么用呢?
假設(shè)我們的樣本是m*n的矩陣X,如果我們通過SVD找到了
矩陣最大的k個特征向量組成的k*n的矩陣 ,則我們可以做如下處理:可以得到一個m*k的矩陣X',這個矩陣和我們原來m*n的矩陣X相比,列數(shù)從n減到了k,可見對列數(shù)進行了壓縮。也就是說,左奇異矩陣可以用于對行數(shù)的壓縮;右奇異矩陣可以用于對列(即特征維度)的壓縮。這就是我們用SVD分解協(xié)方差矩陣實現(xiàn)PCA可以得到兩個方向的PCA降維(即行和列兩個方向)。
還是看示例:
##Python實現(xiàn)PCA import numpy as np def pca(X,k):#k is the components you want#mean of each featuren_samples, n_features = X.shapemean=np.array([np.mean(X[:,i]) for i in range(n_features)])#normalizationnorm_X=X-mean#scatter matrixscatter_matrix=np.dot(np.transpose(norm_X),norm_X)#Calculate the eigenvectors and eigenvalueseig_val, eig_vec = np.linalg.eig(scatter_matrix)eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]# sort eig_vec based on eig_val from highest to lowesteig_pairs.sort(reverse=True)# select the top k eig_vecfeature=np.array([ele[1] for ele in eig_pairs[:k]])#get new datadata=np.dot(norm_X,np.transpose(feature))return dataX = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])print(pca(X,1))上面代碼實現(xiàn)了對數(shù)據(jù)X進行特征的降維。結(jié)果如下:
用sklearn的PCA與我們的PCA做個比較:
##用sklearn的PCA from sklearn.decomposition import PCA import numpy as np X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) pca=PCA(n_components=1)pca.fit(X) print(pca.transform(X))結(jié)果如下:
搞了半天結(jié)果不是很一樣啊。sklearn中的PCA是通過svd_flip函數(shù)實現(xiàn)的,sklearn對奇異值分解結(jié)果進行了一個處理,因為ui*σi*vi=(-ui)*σi*(-vi),也就是u和v同時取反得到的結(jié)果是一樣的,而這會導(dǎo)致通過PCA降維得到不一樣的結(jié)果(雖然都是正確的)。
整個PCA過程貌似及其簡單,就是求協(xié)方差的特征值和特征向量,然后做數(shù)據(jù)轉(zhuǎn)換。但是有沒有覺得很神奇,為什么求協(xié)方差的特征向量就是最理想的k維向量?其背后隱藏的意義是什么?整個PCA的意義是什么?
4. PCA的理論推導(dǎo)
PCA有兩種通俗易懂的解釋:(1)最大方差理論;(2)最小化降維造成的損失。這兩個思路都能推導(dǎo)出同樣的結(jié)果。
我在這里只介紹最大方差理論:
在信號處理中認為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。樣本在u1上的投影方差較大,在u2上的投影方差較小,那么可認為u2上的投影是由噪聲引起的。
因此我們認為,最好的k維特征是將n維樣本點轉(zhuǎn)換為k維后,每一維上的樣本方差都很大。
比如我們將下圖中的5個點投影到某一維上,這里用一條過原點的直線表示(數(shù)據(jù)已經(jīng)中心化):
假設(shè)我們選擇兩條不同的直線做投影,那么左右兩條中哪個好呢?根據(jù)我們之前的方差最大化理論,左邊的好,因為投影后的樣本點之間方差最大(也可以說是投影的絕對值之和最大)。
計算投影的方法見下圖
圖中,紅色點表示樣例,藍色點表示在u上的投影,u是直線的斜率也是直線的方向向量,而且是單位向量。藍色點是在u上的投影點,離原點的距離是<x,u>(即
或者 )。5. 選擇降維后的維度K(主成分的個數(shù))
如何選擇主成分個數(shù)K呢?先來定義兩個概念:
選擇不同的K值,然后用下面的式子不斷計算,選取能夠滿足下列式子條件的最小K值即可。
其中t值可以由自己定,比如t值取0.01,則代表了該PCA算法保留了99%的主要信息。當你覺得誤差需要更小,可以把t值設(shè)的更小。上式還可以用SVD分解時產(chǎn)生的S矩陣來表示,如下面的式子:
6. SVD與PCA的關(guān)系
假設(shè)我們矩陣每一行表示一個樣本,每一列表示一個feature,用矩陣的語言來表示,將一個m * n的矩陣A進行坐標軸的變化,P就是一個變換的矩陣從一個N維的空間變換到另一個N維的空間,矩陣A在空間中就會進行一些類似于旋轉(zhuǎn)、拉伸的變化。
而將一個m * n的矩陣A變換成一個m * r的矩陣,這樣就會使得本來有n個feature的,變成了有r個feature了(r < n),這r個其實就是對n個feature的一種提煉,我們就把這個稱為feature的壓縮。用數(shù)學語言表示就是:
但是這個怎么和SVD扯上關(guān)系呢?之前談到,SVD得出的奇異向量也是從奇異值由大到小排列的,按PCA的觀點來看,就是方差最大的坐標軸就是第一個奇異向量,方差次大的坐標軸就是第二個奇異向量…我們回憶一下之前得到的SVD式子:
在矩陣的兩邊同時右乘上一個矩陣V,由于V是一個正交的矩陣,所以V轉(zhuǎn)置乘以V得到單位陣
,所以可以化成后面的式子將后面的式子與A * P那個m * n的矩陣變換為m * r的矩陣的式子對照看看,在這里,其實V就是P,也就是一個變化的向量。這里是將一個m * n 的矩陣壓縮到一個m * r的矩陣,也就是對列進行壓縮,如果我們想對行進行壓縮(在PCA的觀點下,對行進行壓縮可以理解為,將一些相似的sample合并在一起,或者將一些沒有太大價值的sample去掉)怎么辦呢?同樣我們寫出一個通用的行壓縮例子:
這樣就從一個m行的矩陣壓縮到一個r行的矩陣了,對SVD來說也是一樣的,我們對SVD分解的式子兩邊乘以U的轉(zhuǎn)置
這樣我們就得到了對行進行壓縮的式子。可以看出,其實PCA幾乎可以說是對SVD的一個包裝,如果我們實現(xiàn)了SVD,那也就實現(xiàn)了PCA了,而且更好的地方是,有了SVD,我們就可以得到兩個方向的PCA,如果我們對
進行特征值的分解,只能得到一個方向的PCA。轉(zhuǎn)載于:
機器學習中的數(shù)學(5)-強大的矩陣奇異值分解(SVD)及其應(yīng)用 - LeftNotEasy - 博客園?www.cnblogs.com主成分分析(PCA)原理詳解_網(wǎng)絡(luò)_Microstrong-CSDN博客?blog.csdn.nethttp://blog.codinglabs.org/articles/pca-tutorial.html?blog.codinglabs.org總結(jié)
以上是生活随笔為你收集整理的pca各个向量之间的相关度_PCA主成分分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue删除数组中的一条数据_删除排序数组
- 下一篇: python你会吗_Python这些问题