机器学习中的数学基础:(3)主成分分析(PCA)及其应用
主成分分析主要用于數(shù)據(jù)的降維?什么是降維?
比如說有如下的房價數(shù)據(jù):
? ?這種一維數(shù)據(jù)可以直接放在實數(shù)軸上:
房價樣本數(shù)據(jù)用X表示,則以上數(shù)據(jù)的均值為:
以均值為原點:
將上述表格以均值,做“中心化”處理,再求方差。
中心化之后看到數(shù)據(jù)分為兩類:
接下來新增加房屋面積,可以看到兩者正相關(guān)(此例是理想情況下,房價和面積完全成正比,所以會在一條直線上),有一列數(shù)據(jù)就是多余的。
? ? ? ? ? ? ?
分別對以上兩列數(shù)據(jù)“中心化”處理,如上右圖。
那么房價(X)和面積(Y)的協(xié)方差就是這樣的:
將此二維數(shù)據(jù)畫在坐標(biāo)軸(橫縱坐標(biāo)分別為房價和面積)上如左: ? ? ? ? ? 將坐標(biāo)軸進(jìn)行旋轉(zhuǎn),橫坐標(biāo)與這條直線重合:(如右)?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
經(jīng)過旋轉(zhuǎn)后的坐標(biāo)系橫縱坐標(biāo)不再代表房價和面積了,而是兩者的混合(術(shù)語就是線性組合)這里把他們稱作主元1,主元2,坐標(biāo)值就很容易用勾股定理計算出來,比如a在主元1的坐標(biāo)值如下,很顯然a在主元2上的坐標(biāo)值為0;再把所有的房間換算到新的坐標(biāo)系上,
? ? ? ? ? ? ? ? ? ? ? ??
從上述分析可以看出,主元2全為0,完全是多余的。只需要主元1就夠了,這樣就把數(shù)據(jù)降為一維,而且還沒有丟失信息。
PS:現(xiàn)實實際中,房價和面積雖然成正比,但是也會有一些出入,所以改為如下:
? ? ? ? ? ??
把這些數(shù)據(jù)任然表示在坐標(biāo)軸上如上右。
從線性代數(shù)的角度分析,二維坐標(biāo)系總有各自的正交基,也就是兩輛正交,模長為1,表示為
? ? ? ? ? ? ? ? ? ?
假設(shè)在某一坐標(biāo)系下有一個點a,他在坐標(biāo)系下標(biāo)準(zhǔn)標(biāo)準(zhǔn)基的線性組合為如上。
在不同的坐標(biāo)系中x y的值會不同,旋轉(zhuǎn)坐標(biāo)系會看出來。如下
但是觀察發(fā)現(xiàn)a到坐標(biāo)系原點的距離d并不會隨著坐標(biāo)系的改變而變化。()
? ???
所以在某個坐標(biāo)系下,分配給x的多,那么分配給y的就必然較少,反之亦然。最極端的情況下,在某個坐標(biāo)系下,全部分配給x,使得y=0。
? ? ? ? ? ?
那么在這個坐標(biāo)系下就可以降維了,去掉并不會丟失信息。如上右。
為了達(dá)到降維應(yīng)該盡量選擇多分配給,少分配給的坐標(biāo)系。
參考知乎:https://www.matongxue.com/madocs/1025.html
? ? ? ? ? ? ? ? ?https://zhuanlan.zhihu.com/p/21580949
為什么要降維?
答:在許多領(lǐng)域的研究與應(yīng)用中,通常需要對含有多個變量的數(shù)據(jù)進(jìn)行觀測,收集大量數(shù)據(jù)后進(jìn)行分析尋找規(guī)律。多變量大數(shù)據(jù)集無疑會為研究和應(yīng)用提供豐富的信息,但是也在一定程度上增加了數(shù)據(jù)采集的工作量。更重要的是在很多情形下,許多變量之間可能存在相關(guān)性,從而增加了問題分析的復(fù)雜性。如果分別對每個指標(biāo)進(jìn)行分析,分析往往是孤立的,不能完全利用數(shù)據(jù)中的信息,因此盲目減少指標(biāo)會損失很多有用的信息,從而產(chǎn)生錯誤的結(jié)論。
因此需要找到一種合理的方法,在減少需要分析的指標(biāo)同時,盡量減少原指標(biāo)包含信息的損失,以達(dá)到對所收集數(shù)據(jù)進(jìn)行全面分析的目的。由于各變量之間存在一定的相關(guān)關(guān)系,因此可以考慮將關(guān)系緊密的變量變成盡可能少的新變量,使這些新變量是兩兩不相關(guān)的,那么就可以用較少的綜合指標(biāo)分別代表存在于各個變量中的各類信息。主成分分析與因子分析就屬于這類降維算法。
降維的好處?
降維就是一種對高維度特征數(shù)據(jù)預(yù)處理方法。降維是將高維度的數(shù)據(jù)保留下最重要的一些特征,去除噪聲和不重要的特征,從而實現(xiàn)提升數(shù)據(jù)處理速度的目的。在實際的生產(chǎn)和應(yīng)用中,降維在一定的信息損失范圍內(nèi),可以為我們節(jié)省大量的時間和成本。降維也成為應(yīng)用非常廣泛的數(shù)據(jù)預(yù)處理方法。降低計算的開銷、數(shù)據(jù)集更易使用、去除噪聲、結(jié)果更易理解。
降維的算法有很多,比如奇異值分解(SVD)、主成分分析(PCA)、因子分析(FA)、獨立成分分析(ICA)。
?
-----------------PCA概念--------------------
PCA(Principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數(shù)據(jù)降維算法。PCA的主要思想是將n維特征映
射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎(chǔ)上重新構(gòu)造出來的k維特征。PCA的工作就是從原始的空間中順序地找一組相互正交的坐標(biāo)軸,新的坐標(biāo)軸的選擇與數(shù)據(jù)本身是密切相關(guān)的。其中,第一個新坐標(biāo)軸選擇是原始數(shù)據(jù)中方差最大的方向,第二個新坐標(biāo)軸選取是與第一個坐標(biāo)軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的坐標(biāo)軸。通過這種方式獲得的新的坐標(biāo)軸,我們發(fā)現(xiàn),大部分方差都包含在前面k個坐標(biāo)軸中,后面的坐標(biāo)軸所含的方差幾乎為0。于是,我們可以忽略余下的坐標(biāo)軸,只保留前面k個含有絕大部分方差的坐標(biāo)軸。事實上,這相當(dāng)于只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實現(xiàn)對數(shù)據(jù)特征的降維處理。
------------------如何得到這些包含最大差異性的主成分方向呢?------------
事實上,通過計算數(shù)據(jù)矩陣的協(xié)方差矩陣,然后得到協(xié)方差矩陣的特征值特征向量,選擇特征值最大(即方差最大)的k個特征所對應(yīng)的特征向量組成的矩陣。這樣就可以將數(shù)據(jù)矩陣轉(zhuǎn)換到新的空間當(dāng)中,實現(xiàn)數(shù)據(jù)特征的降維。
由于得到協(xié)方差矩陣的特征值特征向量有兩種方法:特征值分解協(xié)方差矩陣、奇異值分解協(xié)方差矩陣,所以PCA算法有兩種實現(xiàn)方法:基于特征值分解協(xié)方差矩陣實現(xiàn)PCA算法、基于SVD分解協(xié)方差矩陣實現(xiàn)PCA算法。
----------------協(xié)方差和散度矩陣---------
樣本均值: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 樣本方差:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
樣本X和樣本Y的協(xié)方差:
? ? ? ? ? ? ? ? ? ??
由上面的公式,我們可以得到以下結(jié)論:(1) 方差的計算公式是針對一維特征,即針對同一特征不同樣本的取值來進(jìn)行計算得到;而協(xié)方差則必須要求至少滿足二維特征;方差是協(xié)方差的特殊情況。(2) 方差和協(xié)方差的除數(shù)是n-1,這是為了得到方差和協(xié)方差的無偏估計。協(xié)方差為正時,說明X和Y是正相關(guān)關(guān)系;協(xié)方差為負(fù)時,說明X和Y是負(fù)相關(guān)關(guān)系;協(xié)方差為0時,說明X和Y是相互獨立。Cov(X,X)就是X的方差。當(dāng)樣本是n維數(shù)據(jù)時,它們的協(xié)方差實際上是協(xié)方差矩陣(對稱方陣)。例如,對于3維數(shù)據(jù)(x,y,z),計算它的協(xié)方差就是:
散度矩陣定義為:
對于數(shù)據(jù)X的散度矩陣為。其實協(xié)方差矩陣和散度矩陣關(guān)系密切,散度矩陣就是協(xié)方差矩陣乘以(總數(shù)據(jù)量-1)。因此它們的特征值和特征向量是一樣的。這里值得注意的是,散度矩陣是SVD奇異值分解的一步,因此PCA和SVD是有很大聯(lián)系。
-------------特征值分解矩陣原理------------------
(1) 特征值與特征向量
如果一個向量v是矩陣A的特征向量,將一定可以表示成下面的形式:
其中,λ是特征向量v對應(yīng)的特征值,一個矩陣的一組特征向量是一組正交向量。
(2) 特征值分解矩陣
對于矩陣A,有一組特征向量v,將這組向量進(jìn)行正交化單位化,就能得到一組正交單位向量。特征值分解,就是將矩陣A分解為如下式: ? ?其中,Q是矩陣A的特征向量組成的矩陣,則是一個對角陣,對角線上的元素就是特征值。
---------------------SVD分解矩陣原理------------------
SVD講解:https://mp.csdn.net/console/editor/html/105191541
二次型講解:https://www.matongxue.com/madocs/271.html
奇異值分解是一個能適用于任意矩陣的一種分解的方法,對于任意矩陣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)成 Σ。
----------------------------PCA算法兩種實現(xiàn)方法-----------------
(1)基于特征值分解協(xié)方差矩陣實現(xiàn)PCA算法:
輸入:數(shù)據(jù)集,需要降到k維。
1) 去平均值(即去中心化),即每一位特征減去各自的平均值。
2) 計算協(xié)方差矩陣,注:這里除或不除樣本數(shù)量n或n-1,其實對求出的特征向量沒有影響。
3) 用特征值分解方法求協(xié)方差矩陣的特征值與特征向量。
4) 對特征值從大到小排序,選擇其中最大的k個。然后將其對應(yīng)的k個特征向量分別作為行向量組成特征向量矩陣P。
5) 將數(shù)據(jù)轉(zhuǎn)換到k個特征向量構(gòu)建的新空間中,即Y=PX。
----PS:1)關(guān)于這一部分為什么用,這里面含有很復(fù)雜的線性代數(shù)理論推導(dǎo),想了解具體細(xì)節(jié)的可以看下面這篇文章。
CodingLabs - PCA的數(shù)學(xué)原理
2)關(guān)于為什么用特征值分解矩陣,是因為?是方陣,能很輕松的求出特征值與特征向量。當(dāng)然,用奇異值分解也可以,是求特征值與特征向量的另一種方法。
以X為例,我們用PCA方法將這兩行數(shù)據(jù)降到一行。
1)因為X矩陣的每行已經(jīng)是零均值,所以不需要去平均值。
2)求協(xié)方差矩陣:
3)求協(xié)方差矩陣的特征值與特征向量。
求解后的特征值為:
對應(yīng)的特征向量為:
其中對應(yīng)的特征向量分別是一個通解,和可以取任意實數(shù)。那么標(biāo)準(zhǔn)化后的特征向量為:
4)矩陣P為:
5)最后我們用P的第一行乘以數(shù)據(jù)矩陣X,就得到了降維后的表示:
?
數(shù)據(jù)矩陣X降維投影結(jié)果:
(由二維數(shù)據(jù)降為一維)
?
注意PS:如果我們通過特征值分解協(xié)方差矩陣,那么我們只能得到一個方向的PCA降維。這個方向就是對數(shù)據(jù)矩陣X從行(或列)方向上壓縮降維。
(2)基于SVD分解協(xié)方差矩陣實現(xiàn)PCA算法
輸入:數(shù)據(jù)集,需要降到k維。
1) 去平均值,即每一位特征減去各自的平均值。
2) 計算協(xié)方差矩陣。
3) 通過SVD計算協(xié)方差矩陣的特征值與特征向量。
4) 對特征值從大到小排序,選擇其中最大的k個。然后將其對應(yīng)的k個特征向量分別作為列向量組成特征向量矩陣。
5) 將數(shù)據(jù)轉(zhuǎn)換到k個特征向量構(gòu)建的新空間中。
在PCA降維中,我們需要找到樣本協(xié)方差矩陣的最大k個特征向量,然后用這最大的k個特征向量組成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協(xié)方差矩陣,當(dāng)樣本數(shù)多、樣本特征數(shù)也多的時候,這個計算還是很大的。當(dāng)我們用到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ù)進(jìn)行了壓縮。也就是說,左奇異矩陣可以用于對行數(shù)的壓縮;右奇異矩陣可以用于對列(即特征維度)的壓縮。這就是我們用SVD分解協(xié)方差矩陣實現(xiàn)PCA可以得到兩個方向的PCA降維(即行和列兩個方向)。
----------------------PCA實例--------------
#PCA的Python實現(xiàn)
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 data
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))
上面代碼實現(xiàn)了對數(shù)據(jù)X進(jìn)行特征的降維。結(jié)果如下左:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
##用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é)果如上右。
sklearn中的PCA是通過svd_flip函數(shù)實現(xiàn)的,sklearn對奇異值分解結(jié)果進(jìn)行了一個處理,因為ui*σi*vi=(-ui)*σi*(-vi),也就是u和v同時取反得到的結(jié)果是一樣的,而這會導(dǎo)致通過PCA降維得到不一樣的結(jié)果(雖然都是正確的)。具體了解可以看參考文章9或者自己分析一下sklearn中關(guān)于PCA的源碼。
-----------------------------PCA的理論導(dǎo)論-------------
PCA有兩種通俗易懂的解釋:(1)最大方差理論;(2)最小化降維造成的損失。這兩個思路都能推導(dǎo)出同樣的結(jié)果。
我在這里只介紹最大方差理論:
在信號處理中認(rèn)為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。樣本在u1上的投影方差較大,在u2上的投影方差較小,那么可認(rèn)為u2上的投影是由噪聲引起的。因此我們認(rèn)為,最好的k維特征是將n維樣本點轉(zhuǎn)換為k維后,每一維上的樣本方差都很大。比如我們將下圖中的5個點投影到某一維上,這里用一條過原點的直線表示(數(shù)據(jù)已經(jīng)中心化):
假設(shè)我們選擇兩條不同的直線做投影,那么左右兩條中哪個好呢?根據(jù)我們之前的方差最大化理論,左邊的好,因為投影后的樣本點之間方差最大(也可以說是投影的絕對值之和最大)。
計算投影的方法見下圖:
圖中,紅色點表示樣例,藍(lán)色點表示在u上的投影,u是直線的斜率也是直線的方向向量,而且是單位向量。藍(lán)色點是在u上的投影點,離原點的距離是<x,u>(即或者)。
---------------------選擇降維后的維度K(主成分的個數(shù))-------------
如何選擇主成分個數(shù)K呢?先來定義兩個概念:
選擇不同的K值,然后用下面的式子不斷計算,選取能夠滿足下列式子條件的最小K值即可。
其中t值可以由自己定,比如t值取0.01,則代表了該PCA算法保留了99%的主要信息。當(dāng)你覺得誤差需要更小,你可以把t值設(shè)置的更小。上式還可以用SVD分解時產(chǎn)生的S矩陣來表示,如下面的式子:
Reference:
https://mp.weixin.qq.com/s?__biz=MzIyNjY5MDk2Nw==&mid=2247484973&idx=1&sn=c780676196aaa1c950db43f2a448766c&chksm=e86dd4d5df1a5dc3f142b5f94264399b3dda6e84af1b93e7fdbbdc011ce0560c770adec7236d#rd
https://www.joinquant.com/view/community/detail/086db458cdef98e9fe480813b01fb961?type=1
(1) 主成分分析(PCA)原理詳解http://blog.csdn.net/zhongkelee/article/details/44064401
(2) 機器學(xué)習(xí)之PCA主成分分析 - steed灬 - 博客園https://www.cnblogs.com/steed/p/7454329.html
(3) 簡單易學(xué)的機器學(xué)習(xí)算法——主成分分析(PCA)https://blog.csdn.net/google19890102/article/details/27969459
(4) 機器學(xué)習(xí)實戰(zhàn)之PCA - 笨鳥多學(xué) - 博客園https://www.cnblogs.com/zy230530/p/7074215.html
(5) 機器學(xué)習(xí)中的數(shù)學(xué)(5)-強大的矩陣奇異值分解(SVD)及其應(yīng)用 - LeftNotEasy - 博客園http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6) 從PCA和SVD的關(guān)系拾遺https://blog.csdn.net/Dark_Scope/article/details/53150883
(7) CodingLabs - PCA的數(shù)學(xué)原理http://blog.codinglabs.org/articles/pca-tutorial.html
(8) PCA(主成分分析)python實現(xiàn)https://www.jianshu.com/p/4528aaa6dc48
(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的應(yīng)用及部分源碼分析https://www.cnblogs.com/lochan/p/7001907.html
PS:https://mp.weixin.qq.com/s/Dv51K8JETakIKe5dPBAPVg
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的机器学习中的数学基础:(3)主成分分析(PCA)及其应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习中的数学基础:(1)实际应用中矩
- 下一篇: 机器学习中的数学基础:(2)矩阵的奇异值