PCA(主成分分析法)python
1. PCA(最大化方差定義或者最小化投影偏差定義)是一種無監督算法,也就是咱們不須要標籤也能對數據作降維,這就使得其應用範圍更加普遍了。那麼PCA的核心思想是什麼呢?算法
2. PCA存在的問題:函數
3. PCA的做用:優化
4. 方差的做用:我們能夠想象一下,若是一羣人都堆疊在一塊兒,咱們想區分他們是否是比較困難,可是若是這羣人站在馬路兩側,咱們就能夠很清晰的判斷出來應該這是兩夥人。因此基於方差咱們能夠作的就是讓方差來去判斷我們數據的擁擠程度,在這裏咱們認爲方差大的應該辨識度更高一些,由於分的比較開(一條馬路給隔開啦)。方差能夠度量數值型數據的離散程度,數據如果想要區分開來,他那他們的離散程度就須要比較大,也就是方差比較大。spa
5. 協方差的做用:code
6. 計算過程:(下圖爲採用特徵值分解的計算過程,若採用SVM算法,則無需計算協方差矩陣!)component
爲何咱們須要協方差矩陣?咱們最主要的目的是但願能把方差和協方差統一到一個矩陣裏,方便後面的計算。orm
假設咱們只有 a 和 b 兩個變量,那麼咱們將它們按行組成矩陣 X:(與matlab不一樣的是,在numpy中每一列表示每一個樣本的數據,每一行表示一個變量。好比矩陣X,該矩陣表示的意義爲:有m個樣本點,每一個樣本點由兩個變量組成!)
blog
而後:排序
咱們能夠看到這個矩陣對角線上的分別是兩個變量的方差,而其它元素是 a 和 b 的協方差。二者被統一到了一個矩陣裏。
7. 特徵值與特徵向量的計算方法-----特徵值分解與奇異值分解法(SVD)(有關特徵值與奇異值可見個人博文!)
(1) 特徵值分解的求解過程較爲簡單,如下圖爲例子
(2) 特徵值分解存在的缺點:
(3) SVD算法(奇異值分解)的提出克服這些缺點,目前幾乎全部封裝好的PCA算法內部採用的都是SVD算法進行特徵值、特徵向量以及K值的求解。
(4) SVD算法的計算過程:(numpy中已經將SVD進行了封裝,因此只須要調用便可)
能夠發現,採用SVD算法無需計算協方差矩陣,這樣在數據量很是大的時候能夠下降消耗。
利用python實現PCA降維(採用SVD的方法):
1 from numpy import linalg as la 2 import numpy as np 3 #1.矩陣A每一個變量的均值都爲0,因此不用進行「去平均值」處理。假若矩陣A的每一個變量的均值不爲0,則首先須要對數據進行預處理 4 # 才能夠進行協方差矩陣的求解。 5 #2.與matlab不一樣的是,在numpy中每一列表示每一個樣本的數據,每一行表示一個變量。 6 # 好比矩陣A,該矩陣表示的意義爲:有5個樣本點,每一個樣本點由兩個變量組成! 7 #3.np.mat()函數中矩陣的乘積可使用 * 或 .dot()函數 8 # array()函數中矩陣的乘積只能使用 .dot()函數。而星號乘(*)則表示矩陣對應位置元素相乘,與numpy.multiply()函數結果相同。 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("降維前的數據:") 20 print(A.T) 21 print("降維後的數據:") 22 print(A.T * U[:,0])
運行結果圖:與上文采用特徵值分解所獲得的降維結果一致!
8.PCA的重建
衆所周知,PCA能夠將高維數據壓縮爲較少維度的數據,因爲維度有所減小,因此PCA屬於有損壓縮,也就是,壓縮後的數據沒有保持原來數據的所有信息,根據壓縮數據沒法重建本來的高維數據,可是能夠看做本來高維數據的一種近似。
還原的近似數據矩陣Q = 降維後的矩陣G * Ureduce.T
9.採用sklearn封裝好的PCA實現數據降維(採用的是SVD算法):
1 import numpy as np 2 from sklearn.decomposition import PCA 3 # 利用sklearn進行PCA降維處理的時候,數據矩陣A的行數表示數據的個數,數據矩陣A的列數表示每條數據的維度。這與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))
能夠發現,採用sklearn封裝的方法實現PCA與上文的方法達到的結果一致!
10.如何肯定主成分數量(針對於Sklearn封裝的PCA方法而言)
PCA算法將D維數據降至K維,顯然K是須要選擇的參數,表示要保持信息的主成分數量。咱們但願可以找到一個K值,既能大幅下降維度,又能最大限度地保持原有數據內部的結構信息。實現的過程是經過SVD方法獲得的S矩陣進行操做求解,
11.sklearn中封裝的PCA方法的使用介紹。
PCA的函數原型
(1)主要參數介紹
n_components
copy
whiten
(2)主要方法介紹:
fit(X,y=None) :用訓練數據X訓練模型,因爲PCA是無監督降維,所以y=None。
transform(X,y=None) :對X進行降維。
fit_transform(X) :用訓練數據X訓練模型,並對X進行降維。至關於先用fit(X),再用transform(X)。
inverse_transform(X) :將降維後的數據轉換成原始數據。(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個最大的奇異值。
參考資料:https://zhuanlan.zhihu.com/p/77151308?utm_source=qq&utm_medium=social&utm_oi=1095998405318430720