python pca降维_机器学习的降维打击
文章發(fā)布于公號【數(shù)智物語】 (ID:decision_engine),關(guān)注公號不錯過每一篇干貨。
來源 | SAMshare(id:SAMshare)
作者 | samshare
"本次主要講解的內(nèi)容就是特征降維,主要涉及PCA以及一些常見分析方法。"
01
Index
一,PCA降維算法
1. 內(nèi)積與投影
2. 基與基變換
3. 方差
4. 協(xié)方差
5. 協(xié)方差矩陣
6. 協(xié)方差矩陣對角化
7. PCA算法步驟
8. PCA實(shí)例
9. PCA的Python操作
二,LDA降維算法
1. LDA介紹
2. LDA的優(yōu)缺點(diǎn)
3. LDA的Python操作
在機(jī)器學(xué)習(xí)中,我們有的時候會遇到維度災(zāi)難,當(dāng)模型的訓(xùn)練入?yún)⒂泻芏嗟臅r候,往往是需要很多的時間和資源去訓(xùn)練的,而這不是我們想要看到的結(jié)果。一般情況下,我們都是會對源數(shù)據(jù)進(jìn)行特征處理,提取對預(yù)測更加有效的特征。
有的時候,我們會得到比較高維的特征向量,而這里面往往包含很多的噪聲與冗余數(shù)據(jù),所以我們需要通過降維的方式去獲取特征更加有效的信息,一來提高特征表達(dá)能力,二來提高模型訓(xùn)練的效率。
02
PCA降維算法
PCA(Principal Components Analysis),即主成分分析,是降維操作中最經(jīng)典的方法,它是一種線性的、無監(jiān)督、全局性的降維算法,旨在找到數(shù)據(jù)中的"主要成分",提取主成分從而達(dá)到降維的目的。PCA是一種無監(jiān)督算法,也就是我們不需要標(biāo)簽也能對數(shù)據(jù)做降維,這就使得其應(yīng)用范圍更加廣泛了,但是PCA也有一個問題,原來的數(shù)據(jù)中比如包括了年齡,性別,身高等指標(biāo)降維后的數(shù)據(jù)既然維度變小了,那么每一維都是什么含義呢?這個就很難解釋了,所以PCA本質(zhì)來說是無法解釋降維后的數(shù)據(jù)的物理含義。
在了解PCA之前,有一些基礎(chǔ)的名詞需要溫習(xí)一下:
01
內(nèi)積與投影
內(nèi)積運(yùn)算將兩個向量映射為一個實(shí)數(shù),下面是兩個維數(shù)相同的向量的內(nèi)積:
假設(shè)存在兩個點(diǎn)A,B,其在坐標(biāo)軸的位置如下圖:
我們從A向B引一條垂線,也就是A在B上的投影,其夾角為a,則投影的矢量長度為|A|cos(a),其中
是向量A的模,也就是A線段的標(biāo)量長度。
而內(nèi)積的另一種表現(xiàn)形式為:
也就是說,當(dāng)B的模為1的時候,也就是單位向量的時候,內(nèi)積可以表示為:
也就是A與B的內(nèi)積值等于A向B所在直線投影的矢量長度。
02
基與基變換
基可以理解為單位向量,基都是正交的(即內(nèi)積為0,直觀來說就是相互垂直),并且是線性無關(guān)的。
基變換指的是當(dāng)前向量和一個基進(jìn)行內(nèi)積運(yùn)算,得到的結(jié)果作為新的坐標(biāo)分量。
假設(shè)存在一個點(diǎn)(3,2),一般我們都會取(1,0)和(0,1)為基,也就是我們的X和Y軸方向。如果我們?nèi)?1,1)和(-1,1)為我們的基,但我們希望基的模為1,這樣子會方便計(jì)算,所以可以除以當(dāng)前的模長,所以上面的基就變成了:
如下圖所示:
所以,進(jìn)行基變換,只需要進(jìn)行一次內(nèi)積運(yùn)算:
03
方差
一個字段的方差可以看做是每個元素與字段均值的差的平方和的均值,即:
一般我們都會把均值為化為0,即進(jìn)行一次變換,所以方差可以表示為:
04
協(xié)方差
如果單純地選擇方差最大的方向,則無法保證兩個字段之間相互獨(dú)立,因?yàn)槲覀冃枰氖潜M可能多地保留原始信息,但又是相互獨(dú)立,這里我們引入一下概念,協(xié)方差,用來表示兩個字段的相關(guān)性,公式為:
協(xié)方差:度量各個維度偏離其均值的程度。協(xié)方差的值如果為正值,則說明兩者是正相關(guān)的(從協(xié)方差可以引出“相關(guān)系數(shù)”的定義),結(jié)果為負(fù)值就說明負(fù)相關(guān)的,如果為0,也是就是統(tǒng)計(jì)上說的“相互獨(dú)立”。
所以,我們的目標(biāo)就是讓兩個字段的協(xié)方差為0,為了協(xié)方差為0,選擇第二個基的時候,必須要在第一個基的正交方向上選擇。
我們說的PCA降維,就是把N維的特征,降到K維(0 < K < N),也就是說要選擇k個單位正交基,并且盡可能讓方差最大化。
05
協(xié)方差矩陣
在統(tǒng)計(jì)學(xué)與概率論中,協(xié)方差矩陣的每個元素是各個向量元素之間的協(xié)方差,是從標(biāo)量隨機(jī)變量到高維度隨機(jī)向量的自然推廣。
假設(shè)存在矩陣X:
其協(xié)方差矩陣為:
可以看出,協(xié)方差矩陣的對角線元素為兩個字段的方差,而其他元素為矩陣的協(xié)方差,按照我們之前的說法,我們需要得到協(xié)方差為0,并且方差最大的轉(zhuǎn)換。
06
協(xié)方差矩陣對角化
根據(jù)上述推導(dǎo),我們發(fā)現(xiàn)要達(dá)到優(yōu)化目前,等價于將協(xié)方差矩陣對角化:即除對角線外的其它元素化為0,并且在對角線上將元素按大小從上到下排列,這樣我們就達(dá)到了優(yōu)化目的。這樣說可能還不是很明晰,我們進(jìn)一步看下原矩陣與基變換后矩陣協(xié)方差矩陣的關(guān)系。
設(shè)原始數(shù)據(jù)矩陣X對應(yīng)的協(xié)方差矩陣為C,而P是一組基按行組成的矩陣,設(shè)Y=PX,則Y為X對P做基變換后的數(shù)據(jù)。設(shè)Y的協(xié)方差矩陣為D,我們推導(dǎo)一下D與C的關(guān)系:
我們要找的P不是別的,而是能讓原始協(xié)方差矩陣對角化的P。換句話說,優(yōu)化目標(biāo)變成了尋找一個矩陣P,滿足PCP^T是一個對角矩陣,并且對角元素按從大到小依次排列,那么P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維并滿足上述優(yōu)化條件。
07
PCA算法步驟
設(shè)有mXn維數(shù)據(jù)。
1)將原始數(shù)據(jù)按列組成n行m列矩陣X
2)將X的每一行(代表一個屬性字段)進(jìn)行零均值化,即減去這一行的均值
3)求出協(xié)方差矩陣C=1mXXT
4)求出協(xié)方差矩陣的特征值及對應(yīng)的特征向量
5)將特征向量按對應(yīng)特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P
6)Y=PX即為降維到k維后的數(shù)據(jù)
08
PCA實(shí)例
假設(shè)存在2維數(shù)據(jù)
:,需要將其降至1維。
1)均值歸0:目前每個維度的均值均為0,無需變換。
2)求協(xié)方差矩陣
3)求解特征值以及特征向量
可以參考:https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html
4)標(biāo)準(zhǔn)化特征向量
5)得到對角矩陣P并驗(yàn)證對角化
6)因?yàn)樾枰玫?維矩陣,因此用P的第一行乘以原矩陣即可:
降維投影如下圖所示:
09
Python操作
# 使用sklearn進(jìn)行PCA降維import numpy as npfrom sklearn.decomposition import PCAX = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]]) #導(dǎo)入數(shù)據(jù),維度為4print('原矩陣X:', X)pca = PCA(n_components=2) #降到2維pca.fit(X) #訓(xùn)練newX=pca.fit_transform(X) #降維后的數(shù)據(jù)print('貢獻(xiàn)率:', pca.explained_variance_ratio_)print('降維后矩陣:', newX)'''參數(shù)解釋:n_components: 我們可以利用此參數(shù)設(shè)置想要的特征維度數(shù)目,可以是int型的數(shù)字,也可以是閾值百分比,如95%,讓PCA類根據(jù)樣本特征方差來降到合適的維數(shù),也可以指定為string類型,MLE。copy:bool類型,TRUE或者FALSE,是否將原始數(shù)據(jù)復(fù)制一份,這樣運(yùn)行后原始數(shù)據(jù)值不會改變,默認(rèn)為TRUE。whiten:bool類型,是否進(jìn)行白化(就是對降維后的數(shù)據(jù)進(jìn)行歸一化,使方差為1),默認(rèn)為FALSE。如果需要后續(xù)處理可以改為TRUE。explained_variance_: 代表降為后各主成分的方差值,方差值越大,表明越重要。explained_variance_ratio_: 代表各主成分的貢獻(xiàn)率。inverse_transform(): 將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù),X=pca.inverse_transform(newX)。'''output:
03
LDA降維算法
線性判別分析(Linear Discriminant Analysis,LDA)是一種有監(jiān)督學(xué)習(xí)算法,也是經(jīng)常被拿來降維,它和PCA的區(qū)別在于是否存在標(biāo)簽,其中心思想就是—— 最大化類間距離和最小化類內(nèi)距離。
而PCA的不足在于不能很好地分開不同類別的數(shù)據(jù),如下圖:
LDA算法既可以用來降維,又可以用來分類,但是目前來說,主要還是用于降維。在我們進(jìn)行圖像識別圖像識別相關(guān)的數(shù)據(jù)分析時,LDA是一個有力的工具。下面總結(jié)下LDA算法的優(yōu)缺點(diǎn):
01
優(yōu)點(diǎn):
1)在降維過程中可以使用類別的先驗(yàn)知識經(jīng)驗(yàn),而像PCA這樣的無監(jiān)督學(xué)習(xí)則無法使用類別先驗(yàn)知識。
2)LDA在樣本分類信息依賴均值而不是方差的時候,比PCA之類的算法較優(yōu)。
02
缺點(diǎn):
1)LDA不適合對非高斯分布樣本進(jìn)行降維,PCA也有這個問題。
2)LDA降維最多降到類別數(shù)k-1的維數(shù),如果我們降維的維度大于k-1,則不能使用LDA。當(dāng)然目前有一些LDA的進(jìn)化版算法可以繞過這個問題。
3)LDA在樣本分類信息依賴方差而不是均值的時候,降維效果不好。
4)LDA可能過度擬合數(shù)據(jù)。
03
Python操作
import numpy as npfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisX = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])y = np.array([1, 1, 1, 2, 2, 2])clf = LinearDiscriminantAnalysis()clf.fit(X, y) LinearDiscriminantAnalysis(n_components=None, priors=None, shrinkage=None, solver='svd', store_covariance=False, tol=0.0001)print(clf.predict([[-0.8, -1]]))04
Reference
1)Reference十分鐘搞定PCA主成分分析
https://blog.csdn.net/tangyudi/article/details/80188302#comments
2)PCA的數(shù)學(xué)原理
http://blog.codinglabs.org/articles/pca-tutorial.html
星標(biāo)我,每天多一點(diǎn)智慧
總結(jié)
以上是生活随笔為你收集整理的python pca降维_机器学习的降维打击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中小企业信息化及市场
- 下一篇: 难忘的考研岁月