1.相關(guān)背景
????在許多領(lǐng)域的研究應(yīng)用中,通常需要對(duì)含有多個(gè)變量的數(shù)據(jù)進(jìn)行觀測(cè),收集大量數(shù)據(jù)后進(jìn)行分析尋找規(guī)律。多變量大數(shù)據(jù)集無(wú)疑會(huì)為研究和應(yīng)用提供豐富的信息,但是也在一定程度上增加了數(shù)據(jù)采集的工作量。更重要的是在很多情形下,許多變量之間可能存在相關(guān)性,從而增加了問(wèn)題分析的復(fù)雜性。如果分別對(duì)每個(gè)指標(biāo)進(jìn)行分析,分析往往是孤立的,不能完全利用數(shù)據(jù)中的信息,因此盲目減少指標(biāo)會(huì)損失很多有用的信息,從而產(chǎn)生錯(cuò)誤的結(jié)論。
? ? 因此需要找到一種合理的方法,在減少需要分析的指標(biāo)同時(shí),盡量減少原指標(biāo)包含信息的損失,以達(dá)到對(duì)所收集數(shù)據(jù)進(jìn)行全面分析的目的。由于各變量之間存在一定的相關(guān)關(guān)系,因此可以考慮將關(guān)系緊密的變量變成盡可能少的新變量,使這些新變量是兩兩不相關(guān),那么就可以用較少的綜合指標(biāo)分別代表存在于各個(gè)變量中的各類(lèi)信息。主成分分詞與因子分析就屬于這類(lèi)降維算法。
2.數(shù)據(jù)降維
????降維就是一種對(duì)高維度特征數(shù)據(jù)預(yù)處理方法。降維是將高維度的數(shù)據(jù)保留下最重要的一些特征,去除噪聲和不重要的特征,從而實(shí)現(xiàn)提升數(shù)據(jù)處理速度的目的。在實(shí)際的生產(chǎn)和應(yīng)用中,降維在一定的信息損失范圍內(nèi),可以為我們節(jié)省大量的時(shí)間和成本。降維也成為應(yīng)用非常廣泛的數(shù)據(jù)預(yù)處理方法。
? ? 降維具有如下一些優(yōu)點(diǎn)
? ? ? ? (1)使得數(shù)據(jù)集更易使用
? ? ? ? (2)降低算法的計(jì)算開(kāi)銷(xiāo)。
? ? ? ? (3)去除噪聲
? ? ? ? (4)使得結(jié)果更容易理解
降維的算法有很多,比如奇異值分解(SVD)、主成分分析(PCA)、因子分析(FA)、獨(dú)立成分分析(ICA)、LDA
3.PCA原理詳解
????3.1PCA概念
PCA(Principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數(shù)據(jù)降維算法。PCA的主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎(chǔ)上重新構(gòu)造出來(lái)的k維特征。PCA的工作就是從原始的空間中順序地找一組相互正交的坐標(biāo)軸,新的坐標(biāo)軸的選擇與數(shù)據(jù)本身是密切相關(guān)的。其中,第一個(gè)新坐標(biāo)軸選擇是原始數(shù)據(jù)中方差最大的方向,第二個(gè)新坐標(biāo)軸選取是與第一個(gè)坐標(biāo)軸正交的平面中使得方差最大的,第三個(gè)軸是與第1,2個(gè)軸正交的平面紙方差最大的。依次類(lèi)推,可以得到n個(gè)這樣的坐標(biāo)軸。通過(guò)這種方式獲得的新的坐標(biāo)軸,我們發(fā)現(xiàn)大部門(mén)方差都包含在前面k個(gè)坐標(biāo)軸中,后面的坐標(biāo)軸所含的方差幾乎全為0。于是,我們可以忽略余下的坐標(biāo)軸,只保留前面k個(gè)含有絕大部分方差的坐標(biāo)軸。事實(shí)上,這相當(dāng)于只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實(shí)現(xiàn)對(duì)數(shù)據(jù)特征的降維處理。
思考:我們?nèi)绾蔚玫竭@些包含最大差異性的主成分方向呢?
????事實(shí)上,通過(guò)計(jì)算數(shù)據(jù)矩陣的協(xié)方差矩陣,然后得到協(xié)方差矩陣的特征值特征向量,選擇特征值最大(即方差最大)的K個(gè)特征所對(duì)應(yīng)的特征向量組成的矩陣。這樣就可以將矩陣轉(zhuǎn)換到新的空間當(dāng)中,實(shí)現(xiàn)數(shù)據(jù)特征的降維。
? ? 由于得到協(xié)方差矩陣的特征值特征向量有兩種方法:特征值分解方差矩陣、奇異值分解協(xié)方差矩陣,所以PCA算法有兩種實(shí)現(xiàn)方法:基于特征值分解協(xié)方差矩陣實(shí)現(xiàn)PCA算法、基于SVD分解協(xié)方差矩陣實(shí)現(xiàn)PCA算法。
兩個(gè)標(biāo)準(zhǔn):
? ? 1)不同特征之間的方差盡可能大(投影后數(shù)據(jù)盡可能分開(kāi))
? ? 2)不同特征之間的協(xié)方差等于0(特征之間的相關(guān)性)
3.2 協(xié)方差和散度矩陣
樣本均值:
樣本方差:
樣本X和樣本Y的協(xié)方差矩陣:
由上面的公式,我們可以得到以下結(jié)論:
(1)方差的計(jì)算公式是針對(duì)一維特征,即針對(duì)同一特征不同樣本的取值來(lái)進(jìn)行計(jì)算得到;而協(xié)方差則必須要求至少滿足二維特征;方差是協(xié)方差的特殊情況。
(2)方差和協(xié)方差的除數(shù)是n-1,這是為了得到方差和協(xié)方差的無(wú)偏估計(jì)。
協(xié)方差為正時(shí),說(shuō)明X和Y是正相關(guān)關(guān)系;協(xié)方差為負(fù)時(shí),說(shuō)明X和Y是負(fù)相關(guān)關(guān)系;協(xié)方差為0時(shí),說(shuō)明X和Y是相互獨(dú)立。Cov(X,X)就是X的方差。當(dāng)樣本是n維數(shù)據(jù)時(shí),他們的協(xié)方差實(shí)際上是協(xié)方差矩陣(對(duì)稱矩陣)。

對(duì)于數(shù)據(jù)X的散度矩陣為。其實(shí)協(xié)方差矩陣和散度矩陣關(guān)系密切,散度矩陣ius協(xié)方差矩陣乘以(總數(shù)據(jù)量-1)。因此他們的特征值和特征向量是一樣的。這里值得注意的是,散度矩陣是SVD 奇異值分解的一步,因此PCA和SVD是有很大聯(lián)系。
3.5 PCA算法兩種實(shí)現(xiàn)方法
(1) 基于特征值分解協(xié)方差矩陣實(shí)現(xiàn)PCA算法
輸入:數(shù)據(jù)集,需要降到K維。
1)去平均值(即去中心化),即每一位特征減去各自的平均值。中心化的原因:
2)計(jì)算協(xié)方差矩陣,注:這里除或不除樣本數(shù)量n或n-1,其實(shí)對(duì)求出的特征向量每一影響。
3)用特征值分解方法求協(xié)方差矩陣的特征值特征向量
4)對(duì)特征值從大到小排序,選擇其中最大的k個(gè)。然后將其對(duì)應(yīng)的k個(gè)特征向量分別作為行向量組成特征向量矩陣P。
5)將數(shù)據(jù)轉(zhuǎn)換到k個(gè)特征向量構(gòu)建的新空間中,即Y=PX。
注意:如果我們通過(guò)特征值分解協(xié)方差矩陣,那么我們只能得到一個(gè)方向的PCA降維。這個(gè)方向就是對(duì)數(shù)據(jù)矩陣X從行(或列)方向上壓縮降維。
(2)基于SVD分解協(xié)方差矩陣實(shí)現(xiàn)PCA算法
輸入:數(shù)據(jù)集,需要降到K維。
1)去平均值,即每一位特征減去各自的平均值。
2)計(jì)算協(xié)方差矩陣。
3)通過(guò)SVD計(jì)算協(xié)方差矩陣的特征值與特征向量。
4)對(duì)特征值從大到小排序,選擇其中最大的k個(gè)。然后將其對(duì)應(yīng)的k個(gè)特征向量分別作為列向量組成特征向量矩陣。
5)將數(shù)據(jù)轉(zhuǎn)換到k個(gè)特征向量構(gòu)建的新空間中。
在PCA降維中,我們需要找到樣本協(xié)方差矩陣的最大特征向量,然后用這最大的k個(gè)特征向量組成的矩陣來(lái)做低維投影降維??梢钥闯觯谶@個(gè)過(guò)程中需要先求出協(xié)方差矩陣
,當(dāng)樣本數(shù)多、樣本特征數(shù)也多的時(shí)候,這個(gè)計(jì)算量還是很大的。當(dāng)我們用到SVD分解是分解協(xié)方差矩陣的時(shí)候,SVD有兩個(gè)好處:
1)有一些SVD的實(shí)現(xiàn)算法可以先不求出協(xié)方差矩陣,也能求出我們的右奇異矩陣V。也就是說(shuō),我們的PCA算法可以不用做特征值分解而是通過(guò)SVD來(lái)完成,這個(gè)方法在樣本量很大的時(shí)候很有效。實(shí)際上,sklearn的PCA算法的實(shí)現(xiàn)就是用的SVD,而不是特征值分解。
2)注意到PCA僅僅使用了SVD的左奇異值分解,沒(méi)有使用右奇異值矩陣。左奇異矩陣可以用于對(duì)行數(shù)的壓縮;右奇異矩陣可以用于對(duì)列(即特征維度)的壓縮。這就是我們用SVD分解協(xié)方差矩陣實(shí)現(xiàn)PCA可以得到兩個(gè)方向的PCA降維(即行和列兩個(gè)方向)。
也就是說(shuō),左奇異矩陣可以用于對(duì)行數(shù)的壓縮;右奇異矩陣可以用于對(duì)列(即特征維度)的壓縮。這就是我們用SVD分解協(xié)方差矩陣實(shí)現(xiàn)PCA可以得到兩個(gè)方向的PCA降維(即行和列兩個(gè)方向)。
5.PCA的理論推導(dǎo)
PCA有兩種通俗易懂的解釋?zhuān)?1)最大方差理論;(2)最小化降維造成的損失。這兩個(gè)思路都能推導(dǎo)出同樣的結(jié)果。
最大方差理論:在信號(hào)處理中認(rèn)為信號(hào)具有較大的方差,噪聲有較小的方差,信噪比就是信號(hào)與噪聲的方差比,越大越好。樣本在u1上的投影方差較大,在u2上的投影方差較小,那么可認(rèn)為u2上的投影是由噪聲引起的。因此我們認(rèn)為,最好的k維特征是將n維樣本點(diǎn)轉(zhuǎn)換為k維后,每一維上的樣本方差都很大。
PCA本質(zhì)是:將方差最大的方向作為主要特征,并且在各個(gè)方向上將數(shù)據(jù)“離相關(guān)”,也就是讓他們?cè)诓煌环较蛏蠜](méi)有相關(guān)性。
6.PCA算法流程
(1)去平均值,即每一位特征減去各自的平均值;(中心化處理的原因:這些數(shù)字后繼會(huì)參與到統(tǒng)計(jì)運(yùn)算,比如求樣本方差)
(2)計(jì)算協(xié)方差矩陣;
(3)計(jì)算協(xié)方差矩陣的特征向量和特征值;
(4)對(duì)特征值從大到小排序;
(5)保留最大的特征向量;
(6)將數(shù)據(jù)轉(zhuǎn)換到個(gè)特征向量構(gòu)建的新空間中
7.PCA算法實(shí)現(xiàn)的一般流程
(1)對(duì)數(shù)據(jù)進(jìn)行歸一化處理;
(2)計(jì)算歸一化后的數(shù)據(jù)集的協(xié)方差矩陣;
(3)計(jì)算協(xié)方差矩陣的特征值和特征向量;
?(4)保留最重要的k個(gè)特征(通常k要小于n);
?(5)找出k個(gè)特征值相應(yīng)的特征向量
?(6)將m*n的數(shù)據(jù)集乘以k個(gè)n維的特征向量的特征向量(n*k),得到最后降維的數(shù)據(jù)。
8.PCA算法的應(yīng)用場(chǎng)景
?高維數(shù)據(jù)集的探索與可視化
??數(shù)據(jù)壓縮
??圖像、語(yǔ)音、通信的分析處理
??降維(最主要),去除數(shù)據(jù)的冗余和噪聲
9.PCA降維準(zhǔn)則:
(1)最近重構(gòu)性:樣本集中所有點(diǎn),重構(gòu)后的點(diǎn)距離原來(lái)的點(diǎn)的誤差之和最小。
(2)最大可分性:樣本在低維空間的投影盡可能分開(kāi)。
10.PCA算法的優(yōu)缺點(diǎn)
????優(yōu)點(diǎn):
? ? 1)僅僅需要以方差衡量信息量,不受數(shù)據(jù)集以外的因素影響。
? ? 2)各主成分之間正交,可消除原始數(shù)據(jù)成分之間的相互影響的因素。
? ? 3)計(jì)算方法簡(jiǎn)單,主要運(yùn)算是特征值分解,易于實(shí)現(xiàn)。
? ? 缺點(diǎn):
????1)主成分各個(gè)特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強(qiáng)。
? ? ? ? 因?yàn)镻CA需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,第一步需要對(duì)其進(jìn)行中心化,如果數(shù)據(jù)的尺度不統(tǒng)一,還需要標(biāo)準(zhǔn)化。通常的標(biāo)準(zhǔn)化的方式是除以標(biāo)準(zhǔn)差。這里可能就會(huì)出現(xiàn)一個(gè)問(wèn)題,比如標(biāo)準(zhǔn)差很小,接近于0,尤其是被噪聲污染的數(shù)據(jù),噪聲的標(biāo)準(zhǔn)差對(duì)數(shù)據(jù)的放大作用更顯著,而沒(méi)被噪聲污染的數(shù)據(jù)其在標(biāo)準(zhǔn)化的過(guò)程中放大作用較小。
? ? 2)方差小的非主成分也可能含有對(duì)樣本差異的重要信息,因降維丟棄可能對(duì)后續(xù)數(shù)據(jù)處理有影響。
????3)PCA原理主要是為了消除變量之間的相關(guān)性,并且假設(shè)這種相關(guān)性是線性的,對(duì)于非線性的依賴關(guān)系則不能得到很好的結(jié)果。(可以使用KernelPCA)
????4)PCA假設(shè)變量服從高斯分布,當(dāng)變量不服從高斯分布(如均勻分布)時(shí),會(huì)發(fā)生尺度縮放與旋轉(zhuǎn)。
????5)對(duì)降維最終得到的數(shù)目,也就是潛在的隱變量的數(shù)目,不能很好的估計(jì)。
????為了克服PCA的一些缺點(diǎn),出現(xiàn)了很多PCA的變種,比如為解決非線性降維的KPCA,還有解決內(nèi)存限制的增量PCA方法Incremental PCA,以及解決稀疏數(shù)據(jù)降維的PCA方法Sparse PCA等。
PCA(主成分分析)和LDA(線性判別分析)有很多的相似點(diǎn),其本質(zhì)是要將初始樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標(biāo)不一樣;PCA是為了讓映射后的樣本具有最大的發(fā)散性;而LDA是為了讓映射后的樣本有最好的分類(lèi)性能。所以說(shuō)PCA是一種無(wú)監(jiān)督的降維方法,而LDA是一種有監(jiān)督的降維方法。
下面我們總結(jié)下如何使用scikit-learn工具來(lái)進(jìn)行PCA降維:
1. sklearn PCA介紹
????在scikit-learn中,與PCA相關(guān)的類(lèi)都在sklearn.decomposition包中。最常用的PCA類(lèi)就是在scikit-learn中,我們下面主要也會(huì)講解基于這個(gè)類(lèi)的使用的方法。
? ? 除了PCA類(lèi)以外,最常用的PCA相關(guān)類(lèi)還有KernelPCA類(lèi),它主要用于非線性數(shù)據(jù)的降維,需要用到核技巧。因此在使用的時(shí)候需要選擇合適的核函數(shù)并對(duì)核函數(shù)的參數(shù)進(jìn)行調(diào)慘。
? ? 另外一個(gè)常用的PCA相關(guān)類(lèi)是IncrementalPCA類(lèi),它主要是為了解決單機(jī)內(nèi)存限制的。有時(shí)候我們的樣本量可能是上百萬(wàn)+,維度可能也是上千,直接去擬合數(shù)據(jù)可能會(huì)讓內(nèi)存爆炸,此時(shí)我們可以用IncrementalPCA類(lèi)來(lái)解決這個(gè)問(wèn)題。IncrementalPCA先將數(shù)據(jù)分成多個(gè)batch,然后對(duì)每個(gè)batch依次遞增調(diào)用partial_fit()函數(shù),這樣一步步的得到最終的樣本最優(yōu)降解。
? ? 此外還有SparsePCA和MiniBatchSparsePCA。他們和上面講到的PCA類(lèi)的區(qū)別主要是使用了L1的正則化,這樣可以將很多非主要成分的影響度降為0,這樣在PCA降維的時(shí)候我們僅僅需要對(duì)那些比較主要的成分進(jìn)行PCA降維,避免了一些早上之類(lèi)的因素對(duì)我們PCA降維的影響。SparsePCA和MIniBatchSparsePCA之間的區(qū)別則是MiniBatchSparsePCA通過(guò)使用一部分樣本特征和給定的迭代次數(shù)來(lái)進(jìn)行PCA降維,以解決在大樣本時(shí)特征分解過(guò)慢的問(wèn)題,當(dāng)然,代價(jià)就是PCA降維的精確度可能會(huì)降低。使用SparsePCA和MiniBatchSparsePCA需要對(duì)L1正則化參數(shù)進(jìn)行調(diào)參。
2. sklearn.decomposition.PCA參數(shù)介紹
????下面我們主要基于sklearn.decomposition.PCA來(lái)講解如何使用scikit-learn進(jìn)行PCA降維。PCA類(lèi)基本不需要調(diào)參,一般來(lái)說(shuō),我們只需要指定需要降維到的維度,或者我們希望降維后的主成分的方差和占原始維度所有特征方差和的比例閾值就可以了。
? ? sklearn.decomposition.PCA的主要參數(shù)講解:
? ? 1)n_components: 這個(gè)參數(shù)可以幫我們指定希望PCA降維后的特征維度數(shù)目(一般取前10個(gè)就可以獲取大多數(shù)的特征)。最常用的做法是直接指定降維到的維度數(shù)目,此時(shí)n_components是一個(gè)大于等于1的整數(shù)。當(dāng)然,我們也可以指定主成分的方差和所占的最小比例閾值,讓PCA類(lèi)自己去根據(jù)樣本特征方差來(lái)決定降維到的維度數(shù),此時(shí)n_components是一個(gè)(0,1]之間的數(shù)。當(dāng)然,我們還可以將參數(shù)設(shè)置為"mle",此時(shí)PCA類(lèi)會(huì)用MLE算法根據(jù)特征的方差分布情況自己去選擇一定數(shù)量的主成分特征來(lái)降維。我們也可以用默認(rèn)值,即不輸入n_components,此時(shí)n_components=min(樣本數(shù),特征數(shù))
????2)whiten: 判斷是否進(jìn)行白化。所謂白化,就是對(duì)降維后的數(shù)據(jù)的每個(gè)特征進(jìn)行歸一化,讓方差都為1.對(duì)于PCA降維本身來(lái)說(shuō),一般不需要白化。如果你PCA降維后有后續(xù)的數(shù)據(jù)處理動(dòng)作,可以考慮白化。默認(rèn)值是False,即不進(jìn)行白化。
????3)svd_solver:?即指定奇異值分解SVD的方法,由于特征分解是奇異值分解SVD的一個(gè)特例,一般的PCA庫(kù)都是基于SVD實(shí)現(xiàn)的。有4個(gè)可以選擇的值:{"auto","full","arpack","randomized"}。randomized一般適用于數(shù)據(jù)量大,數(shù)據(jù)維度多同時(shí)主成分?jǐn)?shù)目比例又較低的PCA降維,它使用了一些加快SVD的隨機(jī)算法。full則是傳統(tǒng)意義上的SVD,使用了scipy庫(kù)對(duì)應(yīng)的實(shí)現(xiàn)。arpack和randomized的適用場(chǎng)景類(lèi)似,區(qū)別是randomized的是sklearn自己的SVD實(shí)現(xiàn),而arpack直接使用了scipy庫(kù)的sparse SVD實(shí)現(xiàn)。默認(rèn)是auto,即PCA類(lèi)會(huì)自己去前面講到的三種算法里面去權(quán)衡,選擇一個(gè)合適的SVD算法來(lái)降維。一般來(lái)說(shuō),使用默認(rèn)值就夠了。
除了這些輸入?yún)?shù)外,有兩個(gè)PCA類(lèi)的成員值得關(guān)注。第一個(gè)是explained_variance_,它代表降維后的各主成分的方差值。方差值越大,則說(shuō)明越是重要的主成分。第二個(gè)是explained_variance_ratio_,它代表降維后的各主成分的方差值占總方差值的比例,這個(gè)比例越大,則越是重要的主成分。