DataWhale 組隊(duì)學(xué)習(xí) 2021.05 組隊(duì)學(xué)習(xí)系列筆記三

補(bǔ)充內(nèi)容:
一、PCA實(shí)現(xiàn)流程,設(shè)有 m 條 n 維數(shù)據(jù):
S1. 將原始數(shù)據(jù)按列組成 n 行 m 列矩陣 X;
S2. 將 X 的每一行進(jìn)行零均值化,即減去這一行的均值;
S3. 求出協(xié)方差矩陣 ;
S4. 求出協(xié)方差矩陣的特征值及對(duì)應(yīng)的特征向量;
S5. 將特征向量按對(duì)應(yīng)特征值大小從上到下按行排列成矩陣,取前 k 行組成矩陣 P;
S6. Y=PX 即為降維到 k 維后的數(shù)據(jù)。
二、sklearn實(shí)現(xiàn)及參數(shù)說明
- 函數(shù)原型及參數(shù)說明
相關(guān)包 import sklearn.decomposition
常用類 import sklearn.decomposition.PCA
其中,
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
- n_components: int, float, None 或 string,PCA算法中所要保留的主成分個(gè)數(shù),也即保留下來的特征個(gè)數(shù),如果 n_components = 1,將把原始數(shù)據(jù)降到一維;如果賦值為string,如n_components='mle',將自動(dòng)選取特征個(gè)數(shù),使得滿足所要求的方差百分比;如果沒有賦值,默認(rèn)為None,特征個(gè)數(shù)不會(huì)改變(特征數(shù)據(jù)本身會(huì)改變),此時(shí)n_components=min(樣本數(shù),特征數(shù))。這個(gè)參數(shù)可以幫我們指定希望PCA降維后的特征維度數(shù)目。最常用的做法是直接指定降維到的維度數(shù)目。
- copy:True 或False,默認(rèn)為True,即是否需要將原始訓(xùn)練數(shù)據(jù)復(fù)制。
- whiten:True 或False,默認(rèn)為False,所謂白化, 就是對(duì)降維后的數(shù)據(jù)的每個(gè)特征進(jìn)行歸一化,讓方差都為1。對(duì)于PCA降維本身來說,一般不需要白化。如果你PCA降維后有后續(xù)的數(shù)據(jù)處理動(dòng)作,可以考慮白化。
- explained_variance_ratio_:返回所保留各個(gè)特征的方差百分比,如果n_components沒有賦值,則所有特征都會(huì)返回一個(gè)數(shù)值且解釋方差之和等于1。
- svd_solver:即指定奇異值分解SVD的方法,由于特征分解是奇異值分解SVD的一個(gè)特例,一般的PCA庫都是基于SVD實(shí)現(xiàn)的。有4個(gè)可以選擇的值:{‘a(chǎn)uto’, ‘full’, ‘a(chǎn)rpack’, ‘randomized’}。randomized一般適用于數(shù)據(jù)量大,數(shù)據(jù)維度多同時(shí)主成分?jǐn)?shù)目比例又較低的PCA降維,它使用了一些加快SVD的隨機(jī)算法。 full則是傳統(tǒng)意義上的SVD,使用了scipy庫對(duì)應(yīng)的實(shí)現(xiàn)。arpack和randomized的適用場(chǎng)景類似,區(qū)別是randomized使用的是scikit-learn自己的SVD實(shí)現(xiàn),而arpack直接使用了scipy庫的sparse SVD實(shí)現(xiàn)。默認(rèn)是auto,即PCA類會(huì)自己去在前面講到的三種算法里面去權(quán)衡,選擇一個(gè)合適的SVD算法來降維。一般來說,使用默認(rèn)值就夠了。
除了這些輸入?yún)?shù)外,有兩個(gè)PCA類的成員值得關(guān)注。第一個(gè)是explained_variance_,它代表降維后的各主成分的方差值。方差值越大,則說明越是重要的主成分。第二個(gè)是explained_variance_ratio_,它代表降維后的各主成分的方差值占總方差值的比例,這個(gè)比例越大,則越是重要的主成分。
- PCA常用方法
fit(X): 用數(shù)據(jù)X來訓(xùn)練PCA模型。
fit_transform(X):用X來訓(xùn)練PCA模型,同時(shí)返回降維后的數(shù)據(jù)。
inverse_transform(newData) :將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù),但可能不會(huì)完全一樣,會(huì)有些許差別。
transform(X):將數(shù)據(jù)X轉(zhuǎn)換成降維后的數(shù)據(jù),當(dāng)模型訓(xùn)練好后,對(duì)于新輸入的數(shù)據(jù),也可以用transform方法來降維。