PCA降维的原理、方法、以及python实现。
參考:菜菜的sklearn教學(xué)之降維算法.pdf!!
PCA(主成分分析法)
1. PCA(最大化方差定義或者最小化投影誤差定義)是一種無(wú)監(jiān)督算法,也就是我們不需要標(biāo)簽也能對(duì)數(shù)據(jù)做降維,這就使得其應(yīng)用范圍更加廣泛了。那么PCA的核心思想是什么呢?
例如D維變量構(gòu)成的數(shù)據(jù)集,PCA的目標(biāo)是將數(shù)據(jù)投影到維度為K的子空間中,要求K<D且最大化投影數(shù)據(jù)的方差。這里的K值既可以指定,也可以利用主成分的信息來(lái)確定。
PCA其實(shí)就是方差與協(xié)方差的運(yùn)用。
降維的優(yōu)化目標(biāo):將一組 N 維向量降為 K 維,其目標(biāo)是選擇 K 個(gè)單位正交基,使得原始數(shù)據(jù)變換到這組基上后,各變量?jī)蓛砷g協(xié)方差為 0,而變量方差則盡可能大(在正交的約束下,取最大的 K 個(gè)方差)。
2.PCA存在的問(wèn)題:
原來(lái)的數(shù)據(jù)中比如包括了年齡,性別,身高等指標(biāo)降維后的數(shù)據(jù)既然維度變小了,那么每一維都是什么含義呢?這個(gè)就很難解釋了,所以PCA本質(zhì)來(lái)說(shuō)是無(wú)法解釋降維后的數(shù)據(jù)的物理含義,換句話說(shuō)就是降維完啦計(jì)算機(jī)能更好的認(rèn)識(shí)這些數(shù)據(jù),但是咱們就很難理解了。
PCA對(duì)數(shù)據(jù)有兩個(gè)假設(shè):數(shù)據(jù)必須是連續(xù)數(shù)值型;數(shù)據(jù)中沒(méi)有缺失值。
過(guò)擬合:PCA 保留了主要信息,但這個(gè)主要信息只是針對(duì)訓(xùn)練集的,而且這個(gè)主要信息未必是重要信息。有可能舍棄了一些看似無(wú)用的信息,但是這些看似無(wú)用的信息恰好是重要信息,只是在訓(xùn)練集上沒(méi)有很大的表現(xiàn),所以 PCA 也可能加劇了過(guò)擬合;
3. PCA的作用:
緩解維度災(zāi)難:PCA 算法通過(guò)舍去一部分信息之后能使得樣本的采樣密度增大(因?yàn)榫S數(shù)降低了),這是緩解維度災(zāi)難的重要手段;
降噪:當(dāng)數(shù)據(jù)受到噪聲影響時(shí),最小特征值對(duì)應(yīng)的特征向量往往與噪聲有關(guān),將它們舍棄能在一定程度上起到降噪的效果;
特征獨(dú)立:PCA 不僅將數(shù)據(jù)壓縮到低維,它也使得降維之后的數(shù)據(jù)各特征相互獨(dú)立;
4.方差的作用:咱們可以想象一下,如果一群人都堆疊在一起,我們想?yún)^(qū)分他們是不是比較困難,但是如果這群人站在馬路兩側(cè),我們就可以很清晰的判斷出來(lái)應(yīng)該這是兩伙人。所以基于方差我們可以做的就是讓方差來(lái)去判斷咱們數(shù)據(jù)的擁擠程度,在這里我們認(rèn)為方差大的應(yīng)該辨識(shí)度更高一些,因?yàn)榉值谋容^開(kāi)(一條馬路給隔開(kāi)啦)。方差可以度量數(shù)值型數(shù)據(jù)的離散程度,數(shù)據(jù)若是想要區(qū)分開(kāi)來(lái),他那他們的離散程度就需要比較大,也就是方差比較大。
5.協(xié)方差的作用:
6. 計(jì)算過(guò)程:(下圖為采用特征值分解的計(jì)算過(guò)程,若采用SVM算法,則無(wú)需計(jì)算協(xié)方差矩陣!)
為什么我們需要協(xié)方差矩陣?我們最主要的目的是希望能把方差和協(xié)方差統(tǒng)一到一個(gè)矩陣?yán)铮奖愫竺娴挠?jì)算。
假設(shè)我們只有 a 和 b 兩個(gè)變量,那么我們將它們按行組成矩陣 X:(與matlab不同的是,在numpy中每一列表示每個(gè)樣本的數(shù)據(jù),每一行表示一個(gè)變量。比如矩陣X,該矩陣表示的意義為:有m個(gè)樣本點(diǎn),每個(gè)樣本點(diǎn)由兩個(gè)變量組成!)
然后:
Cov(a,a) = E[(a-E(a))(a-E(a))], Cov(b,a) = E[(b-E(b))(a-E(a))],因?yàn)镋(b)=E(a)=0,所以大大簡(jiǎn)化了計(jì)算!!!(這就體現(xiàn)了去中心化的作用!)
我們可以看到這個(gè)矩陣對(duì)角線上的分別是兩個(gè)變量的方差,而其它元素是 a 和 b 的協(xié)方差。兩者被統(tǒng)一到了一個(gè)矩陣?yán)铩?/p>
7. 特征值與特征向量的計(jì)算方法-----特征值分解與奇異值分解法(SVD)(有關(guān)特征值與奇異值可見(jiàn)我的博文!)
(1) 特征值分解的求解過(guò)程較為簡(jiǎn)單,以下圖為例子
(2) 特征值分解存在的缺點(diǎn):
特征值分解中要求協(xié)方差矩陣A必須是方陣,即規(guī)模必須為n*n。
后期計(jì)算最小投影維度K時(shí),計(jì)算量過(guò)大。
當(dāng)樣本維度很高時(shí),協(xié)方差矩陣計(jì)算太慢;
(3) SVD算法(奇異值分解)的提出克服這些缺點(diǎn),目前幾乎所有封裝好的PCA算法內(nèi)部采用的都是SVD算法進(jìn)行特征值、特征向量以及K值的求解。
奇異值(每個(gè)矩陣都有):設(shè)A是一個(gè)mXn矩陣,稱正半定矩陣A‘A的特征值的非負(fù)平方根為矩陣A的奇異值,其中A‘表示矩陣A的共扼轉(zhuǎn)置矩陣(實(shí)數(shù)矩陣的共軛轉(zhuǎn)置矩陣就是轉(zhuǎn)置矩陣,復(fù)數(shù)矩陣的共軛轉(zhuǎn)置矩陣就是上面所說(shuō)的行列互換后每個(gè)元素取共軛)
只有方陣才有特征值。
(4) SVD算法的計(jì)算過(guò)程:(numpy中已經(jīng)將SVD進(jìn)行了封裝,所以只需要調(diào)用即可)
可以發(fā)現(xiàn),采用SVD算法無(wú)需計(jì)算協(xié)方差矩陣,這樣在數(shù)據(jù)量非常大的時(shí)候可以降低消耗。
A為數(shù)據(jù)矩陣,大小為M*N(2*5)
U是一個(gè)由與數(shù)據(jù)點(diǎn)之間具有最小投影誤差的方向向量所構(gòu)成的矩陣,大小為M*M(2*2),假如想要將數(shù)據(jù)由M維降至K維,只需要從矩陣U中選擇前K個(gè)列向量,得到一個(gè)M*K的矩陣,記為Ureduce。按照下面的公式即可計(jì)算降維后的新數(shù)據(jù):降維后的數(shù)據(jù)矩陣G = A.T * Ureduce.
sigma為一個(gè)列向量,其包含的值為矩陣A的奇異值。
VT是一個(gè)大小為N*N的矩陣,具體意義我們無(wú)需了解。
利用python實(shí)現(xiàn)PCA降維(采用SVD的方法):
1 from numpy import linalg as la
2 import numpy as np
3 #1.矩陣A每個(gè)變量的均值都為0,所以不用進(jìn)行“去平均值”處理。倘若矩陣A的每個(gè)變量的均值不為0,則首先需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理
4 # 才可以進(jìn)行協(xié)方差矩陣的求解。
5 #2.與matlab不同的是,在numpy中每一列表示每個(gè)樣本的數(shù)據(jù),每一行表示一個(gè)變量。
6 # 比如矩陣A,該矩陣表示的意義為:有5個(gè)樣本點(diǎn),每個(gè)樣本點(diǎn)由兩個(gè)變量組成!
7 #3.np.mat()函數(shù)中矩陣的乘積可以使用 * 或 .dot()函數(shù)
8 # array()函數(shù)中矩陣的乘積只能使用 .dot()函數(shù)。而星號(hào)乘(*)則表示矩陣對(duì)應(yīng)位置元素相乘,與numpy.multiply()函數(shù)結(jié)果相同。
9 A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]])
10 # A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]).T
11 U, sigma, VT = la.svd(A)
12 print("U:")
13 print(U)
14 print("sigma:")
15 print(sigma)
16 print("VT:")
17 print(VT)
18 print("-"*30)
19 print("降維前的數(shù)據(jù):")
20 print(A.T)
21 print("降維后的數(shù)據(jù):")
22 print(A.T * U[:,0])
運(yùn)行結(jié)果圖:與上文采用特征值分解所得到的降維結(jié)果一致!
8.PCA的重建
眾所周知,PCA可以將高維數(shù)據(jù)壓縮為較少維度的數(shù)據(jù),由于維度有所減少,所以PCA屬于有損壓縮,也就是,壓縮后的數(shù)據(jù)沒(méi)有保持原來(lái)數(shù)據(jù)的全部信息,根據(jù)壓縮數(shù)據(jù)無(wú)法重建原本的高維數(shù)據(jù),但是可以看作原本高維數(shù)據(jù)的一種近似。
還原的近似數(shù)據(jù)矩陣Q = 降維后的矩陣G * Ureduce.T
9.采用sklearn封裝好的PCA實(shí)現(xiàn)數(shù)據(jù)降維(采用的是SVD算法):
1 import numpy as np 2 from sklearn.decomposition import PCA 3 # 利用sklearn進(jìn)行PCA降維處理的時(shí)候,數(shù)據(jù)矩陣A的行數(shù)表示數(shù)據(jù)的個(gè)數(shù),數(shù)據(jù)矩陣A的列數(shù)表示每條數(shù)據(jù)的維度。這與numpy中是相反的! 4 # A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]).T 5 A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]) 6 pca = PCA(n_components = 1) 7 pca.fit(A) 8 # 投影后的特征維度的方差比例 9 print(pca.explained_variance_ratio_) 10 # 投影后的特征維度的方差 11 print(pca.explained_variance_) 12 print(pca.transform(A))
可以發(fā)現(xiàn),采用sklearn封裝的方法實(shí)現(xiàn)PCA與上文的方法達(dá)到的結(jié)果一致!
10.如何確定主成分?jǐn)?shù)量(針對(duì)于Sklearn封裝的PCA方法而言)
PCA算法將D維數(shù)據(jù)降至K維,顯然K是需要選擇的參數(shù),表示要保持信息的主成分?jǐn)?shù)量。我們希望能夠找到一個(gè)K值,既能大幅降低維度,又能最大限度地保持原有數(shù)據(jù)內(nèi)部的結(jié)構(gòu)信息。實(shí)現(xiàn)的過(guò)程是通過(guò)SVD方法得到的S矩陣進(jìn)行操作求解,
11.sklearn中封裝的PCA方法的使用介紹。
PCA的函數(shù)原型
(1)主要參數(shù)介紹
n_components
這個(gè)參數(shù)類型有int型,float型,string型,默認(rèn)為None。它的作用是指定PCA降維后的特征數(shù)(也就是降維后的維度)。
若取默認(rèn)(None),則n_components==min(n_samples, n_features),即降維后特征數(shù)取樣本數(shù)和原有特征數(shù)之間較小的那個(gè);
若n_components}設(shè)置為‘mle’并且svd_solver設(shè)置為‘full’則使用MLE算法根據(jù)特征的方差分布自動(dòng)去選擇一定數(shù)量的主成分特征來(lái)降維;
若0<n_components<1,則n_components的值為主成分方差的閾值; 通過(guò)設(shè)置該變量,即可調(diào)整主成分?jǐn)?shù)量K。
若n_components≥1,則降維后的特征數(shù)為n_components;
copy
bool (default True)
在運(yùn)行算法時(shí),將原始訓(xùn)練數(shù)據(jù)復(fù)制一份。參數(shù)為bool型,默認(rèn)是True,傳給fit的原始訓(xùn)練數(shù)據(jù)X不會(huì)被覆蓋;若為False,則傳給fit后,原始訓(xùn)練數(shù)據(jù)X會(huì)被覆蓋。
whiten
bool, optional (default False)
是否對(duì)降維后的數(shù)據(jù)的每個(gè)特征進(jìn)行歸一化。參數(shù)為bool型,默認(rèn)是False。
(2)主要方法介紹:
fit(X,y=None) :用訓(xùn)練數(shù)據(jù)X訓(xùn)練模型,由于PCA是無(wú)監(jiān)督降維,因此y=None。
transform(X,y=None) :對(duì)X進(jìn)行降維。
fit_transform(X) :用訓(xùn)練數(shù)據(jù)X訓(xùn)練模型,并對(duì)X進(jìn)行降維。相當(dāng)于先用fit(X),再用transform(X)。
inverse_transform(X) :將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù)。(PCA的重建)
(3)主要屬性介紹:
components:array, shape (n_components, n_features) ,降維后各主成分方向,并按照各主成分的方差值大小排序。
explained_variance:array, shape (n_components,) ,降維后各主成分的方差值,方差值越大,越主要。
explained_variance_ratio:array, shape (n_components,) ,降維后的各主成分的方差值占總方差值的比例,比例越大,則越主要。
singular_values:array, shape (n_components,) ,奇異值分解得到的前n_components個(gè)最大的奇異值。
二、LDA
1. 類間距離最大,類內(nèi)距離最小(核心思想)
2. LDA的原理,公式推導(dǎo)見(jiàn)西瓜書(shū),這里主要講一下PCA與LDA的異同點(diǎn)!
PCA為非監(jiān)督降維,LDA為有監(jiān)督降維PCA希望投影后的數(shù)據(jù)方差盡可能的大(最大可分性),因?yàn)槠浼僭O(shè)方差越多,則所包含的信息越多;而LDA則希望投影后相同類別的組內(nèi)方差小,而組間方差大。LDA能合理運(yùn)用標(biāo)簽信息,使得投影后的維度具有判別性,不同類別的數(shù)據(jù)盡可能的分開(kāi)。舉個(gè)簡(jiǎn)單的例子,在語(yǔ)音識(shí)別領(lǐng)域,如果單純用PCA降維,則可能功能僅僅是過(guò)濾掉了噪聲,還是無(wú)法很好的區(qū)別人聲,但如果有標(biāo)簽識(shí)別,用LDA進(jìn)行降維,則降維后的數(shù)據(jù)會(huì)使得每個(gè)人的聲音都具有可分性,同樣的原理也適用于臉部特征識(shí)別。
所以,可以歸納總結(jié)為有標(biāo)簽就盡可能的利用標(biāo)簽的數(shù)據(jù)(LDA),而對(duì)于純粹的非監(jiān)督任務(wù),則還是得用PCA進(jìn)行數(shù)據(jù)降維。
LDA降維最低可以降維到(類別數(shù)-1),而PCA沒(méi)有限制
參考資料:https://zhuanlan.zhihu.com/p/77151308?utm_source=qq&utm_medium=social&utm_oi=1095998405318430720
總結(jié)
以上是生活随笔為你收集整理的PCA降维的原理、方法、以及python实现。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu14.04中 gedit 凝
- 下一篇: 在网页不跳转的前提下更新网页内容(局部刷