用scikit-learn學習主成分分析(PCA)

主成分分析(PCA)原理總結中,咱們對主成分分析(如下簡稱PCA)的原理作了總結,下面咱們就總結下如何使用scikit-learn工具來進行PCA降維。html

1、scikit-learn PCA類介紹

    在scikit-learn中,與PCA相關的類都在sklearn.decomposition包中。最經常使用的PCA類就是sklearn.decomposition.PCA,咱們下面主要也會講解基於這個類的使用的方法。python

    除了PCA類之外,最經常使用的PCA相關類還有KernelPCA類,在原理篇咱們也講到了,它主要用於非線性數據的降維,須要用到核技巧。所以在使用的時候須要選擇合適的核函數並對核函數的參數進行調參。git

    另一個經常使用的PCA相關類是IncrementalPCA類,它主要是爲了解決單機內存限制的。有時候咱們的樣本量多是上百萬+,維度可能也是上千,直接去擬合數據可能會讓內存爆掉, 此時咱們能夠用IncrementalPCA類來解決這個問題。IncrementalPCA先將數據分紅多個batch,而後對每一個batch依次遞增調用partial_fit函數,這樣一步步的獲得最終的樣本最優降維。github

    此外還有SparsePCA和MiniBatchSparsePCA。他們和上面講到的PCA類的區別主要是使用了L1的正則化,這樣能夠將不少非主要成分的影響度降爲0,這樣在PCA降維的時候咱們僅僅須要對那些相對比較主要的成分進行PCA降維,避免了一些噪聲之類的因素對咱們PCA降維的影響。SparsePCA和MiniBatchSparsePCA之間的區別則是MiniBatchSparsePCA經過使用一部分樣本特徵和給定的迭代次數來進行PCA降維,以解決在大樣本時特徵分解過慢的問題,固然,代價就是PCA降維的精確度可能會下降。使用SparsePCA和MiniBatchSparsePCA須要對L1正則化參數進行調參。算法

2、sklearn.decomposition.PCA參數介紹

    下面咱們主要基於sklearn.decomposition.PCA來說解如何使用scikit-learn進行PCA降維。PCA類基本不須要調參,通常來講,咱們只須要指定咱們須要降維到的維度,或者咱們但願降維後的主成分的方差和佔原始維度全部特徵方差和的比例閾值就能夠了。微信

    如今咱們對sklearn.decomposition.PCA的主要參數作一個介紹:dom

    1)n_components:這個參數能夠幫咱們指定但願PCA降維後的特徵維度數目。最經常使用的作法是直接指定降維到的維度數目,此時n_components是一個大於等於1的整數。固然,咱們也能夠指定主成分的方差和所佔的最小比例閾值,讓PCA類本身去根據樣本特徵方差來決定降維到的維度數,此時n_components是一個(0,1]之間的數。固然,咱們還能夠將參數設置爲"mle", 此時PCA類會用MLE算法根據特徵的方差分佈狀況本身去選擇必定數量的主成分特徵來降維。咱們也能夠用默認值,即不輸入n_components,此時n_components=min(樣本數,特徵數)。函數

    2)whiten :判斷是否進行白化。所謂白化,就是對降維後的數據的每一個特徵進行歸一化,讓方差都爲1.對於PCA降維自己來講,通常不須要白化。若是你PCA降維後有後續的數據處理動做,能夠考慮白化。默認值是False,即不進行白化。工具

    3)svd_solver:即指定奇異值分解SVD的方法,因爲特徵分解是奇異值分解SVD的一個特例,通常的PCA庫都是基於SVD實現的。有4個能夠選擇的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized通常適用於數據量大,數據維度多同時主成分數目比例又較低的PCA降維,它使用了一些加快SVD的隨機算法。 full則是傳統意義上的SVD,使用了scipy庫對應的實現。arpack和randomized的適用場景相似,區別是randomized使用的是scikit-learn本身的SVD實現,而arpack直接使用了scipy庫的sparse SVD實現。默認是auto,即PCA類會本身去在前面講到的三種算法裏面去權衡,選擇一個合適的SVD算法來降維。通常來講,使用默認值就夠了。post

    除了這些輸入參數外,有兩個PCA類的成員值得關注。第一個是explained_variance_,它表明降維後的各主成分的方差值。方差值越大,則說明越是重要的主成分。第二個是explained_variance_ratio_,它表明降維後的各主成分的方差值佔總方差值的比例,這個比例越大,則越是重要的主成分。

3、PCA實例

    下面咱們用一個實例來學習下scikit-learn中的PCA類使用。爲了方便的可視化讓你們有一個直觀的認識,咱們這裏使用了三維的數據來降維。

    完整代碼參見個人github: https://github.com/nickchen121/machinelearning/blob/master/classic-machine-learning/pca.ipynb

    首先咱們生成隨機數據並可視化,代碼以下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X爲樣本特徵,Y爲樣本簇類別, 共1000個樣本,每一個樣本3個特徵,共4個簇
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2], 
                  random_state =9)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')

    三維數據的分佈圖以下:

    咱們先不降維,只對數據進行投影,看看投影后的三個維度的方差分佈,代碼以下:

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_

    輸出以下:

[ 0.98318212  0.00850037  0.00831751]
[ 3.78483785  0.03272285  0.03201892]

    能夠看出投影后三個特徵維度的方差比例大約爲98.3%:0.8%:0.8%。投影后第一個特徵佔了絕大多數的主成分比例。

    如今咱們來進行降維,從三維降到2維,代碼以下:

pca = PCA(n_components=2)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_

    輸出以下:

[ 0.98318212  0.00850037]
[ 3.78483785  0.03272285]

    這個結果其實能夠預料,由於上面三個投影后的特徵維度的方差分別爲:[ 3.78483785  0.03272285  0.03201892],投影到二維後選擇的確定是前兩個特徵,而拋棄第三個特徵。

    爲了有個直觀的認識,咱們看看此時轉化後的數據分佈,代碼以下:

X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()

    輸出的圖以下:

    可見降維後的數據依然能夠很清楚的看到咱們以前三維圖中的4個簇。

    如今咱們看看不直接指定降維的維度,而指定降維後的主成分方差和比例。

pca = PCA(n_components=0.95)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    咱們指定了主成分至少佔95%,輸出以下:

[ 0.98318212]
[ 3.78483785]
1

 

```
    可見只有第一個投影特徵被保留。這也很好理解,咱們的第一個主成分佔投影特徵的方差比例高達98%。只選擇這一個特徵維度即可以知足95%的閾值。咱們如今選擇閾值99%看看,代碼以下:

pca = PCA(n_components=0.99)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    此時的輸出以下:

[ 0.98318212 0.00850037]
[ 3.78483785 0.03272285]
2

    這個結果也很好理解,由於咱們第一個主成分佔了98.3%的方差比例,第二個主成分佔了0.8%的方差比例,二者一塊兒能夠知足咱們的閾值。

    最後咱們看看讓MLE算法本身選擇降維維度的效果,代碼以下:

pca = PCA(n_components='mle')
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    輸出結果以下:

[ 0.98318212]
[ 3.78483785]
1

    可見因爲咱們的數據的第一個投影特徵的方差佔比高達98.3%,MLE算法只保留了咱們的第一個特徵。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索