機器學習降維--PCA


1.原理和概念

PCA(Principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數據降維算法。

PCA的主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎上重新構造出來的k維特征。

PCA的工作就是從原始的空間中順序地找一組相互正交的坐標軸,新的坐標軸的選擇與數據本身是密切相關的。

其中,第一個新坐標軸選擇是原始數據中方差最大的方向,第二個新坐標軸選取是與第一個坐標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。

可以得到n個這樣的坐標軸。通過這種方式獲得的新的坐標軸,大部分方差都包含在前面k個坐標軸中,后面的坐標軸所含的方差幾乎為0。於是,可以忽略余下的坐標軸,

只保留前面k個含有絕大部分方差的坐標軸。事實上,這相當於只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實現對數據特征的降維處理。

如何得到這些包含最大差異性的主成分方向。通過計算數據矩陣的協方差矩陣,然后得到協方差矩陣的特征值特征向量,選擇特征值最大(即方差最大)的k個特征所對應的特征向量組成的矩陣。

這樣就可以將數據矩陣轉換到新的空間當中,實現數據特征的降維。由於得到協方差矩陣的特征值特征向量有兩種方法:特征值分解協方差矩陣、奇異值分解協方差矩陣。

  • 基於特征值分解協方差矩陣實現PCA算法
  • 基於SVD分解協方差矩陣實現PCA算法

2協方差和散度矩陣

樣本均值:

[公式]

樣本方差:

[公式]

樣本X和樣本Y的協方差:

[公式]

由上面的公式,得到以下結論:

(1) 方差的計算公式是針對一維特征,即針對同一特征不同樣本的取值來進行計算得到;而協方差則必須要求至少滿足二維特征;方差是協方差的特殊情況。

(2) 方差和協方差的除數是n-1,這是為了得到方差和協方差的無偏估計。

協方差為正時,說明X和Y是正相關關系;協方差為負時,說明X和Y是負相關關系;協方差為0時,說明X和Y是相互獨立。

Cov(X,X)就是X的方差。當樣本是n維數據時,它們的協方差實際上是協方差矩陣(對稱方陣)。例如,對於3維數據(x,y,z),計算它的協方差就是:

散布矩陣(散度矩陣)前乘以系數1/(n-1)就可以得到協方差矩陣:

關系:散度矩陣=類內離散度矩陣=類內離差陣=協方差矩陣×(n-1)

 

3 PCA算法兩種實現方法

(1) 基於特征值分解協方差矩陣實現PCA算法

輸入:數據集 [公式] ,需要降到k維。

1) 去平均值(即去中心化),即每一位特征減去各自的平均值。

2) 計算協方差矩陣 [公式],注:這里除或不除樣本數量n或n-1,其實對求出的特征向量沒有影響。

3) 用特征值分解方法求協方差矩陣[公式] 的特征值與特征向量。

4) 對特征值從大到小排序,選擇其中最大的k個。然后將其對應的k個特征向量分別作為行向量組成特征向量矩陣P。

5) 將數據轉換到k個特征向量構建的新空間中,即Y=PX。

總結:關於為什么用特征值分解矩陣,是因為 [公式] 是方陣,能很輕松的求出特征值與特征向量。用奇異值分解也可以,是求特征值與特征向量的另一種方法。

舉個例子:

[公式]

以X為例,我們用PCA方法將這兩行數據降到一行。

1)因為X矩陣的每行已經是零均值,所以不需要去平均值。

2)求協方差矩陣:

[公式]

3)求協方差矩陣的特征值與特征向量。

求解后的特征值為:           其中對應的特征向量分別是一個通解, [公式] 和 [公式] 可以取任意實數。那么標准化后的特征向量為:

[公式]                                      [公式] , [公式]

4)矩陣P為:                                            5)最后我們用P的第一行乘以數據矩陣X,就得到了降維后的表示:

[公式]                 [公式]

 

(2) 基於SVD分解協方差矩陣實現PCA算法

輸入:數據集 [公式] ,需要降到k維。

1) 去平均值,即每一位特征減去各自的平均值。

2) 計算協方差矩陣。

3) 通過SVD計算協方差矩陣的特征值與特征向量。

4) 對特征值從大到小排序,選擇其中最大的k個。然后將其對應的k個特征向量分別作為列向量組成特征向量矩陣。

5) 將數據轉換到k個特征向量構建的新空間中。

在PCA降維中,需要找到樣本協方差矩陣 [公式] 的最大k個特征向量,然后用這最大的k個特征向量組成的矩陣來做低維投影降維。

在這個過程中需要先求出協方差矩陣 [公式],當樣本數多、樣本特征數也多的時候,這個計算還是很大的。當我們用到SVD分解協方差矩陣的時候,SVD有兩個好處:

1) 有一些SVD的實現算法可以先不求出協方差矩陣 [公式] 也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解而是通過SVD來完成,在樣本量很大的時候很有效。

     scikit-learn的PCA算法的背后真正的實現就是用的SVD,而不是特征值分解。

2)注意到PCA僅僅使用了我們SVD的左奇異矩陣,沒有使用到右奇異值矩陣,那么右奇異值矩陣有什么用呢?

假設我們的樣本是m*n的矩陣X,如果我們通過SVD找到了矩陣 [公式] 最大的k個特征向量組成的k*n的矩陣 [公式] ,則我們可以做如下處理:[公式]

可以得到一個m*k的矩陣X',這個矩陣和我們原來m*n的矩陣X相比,列數從n減到了k,可見對列數進行了壓縮。

也就是說,左奇異矩陣可以用於對行數的壓縮;右奇異矩陣可以用於對列(即特征維度)的壓縮。這就是用SVD分解協方差矩陣實現PCA可以得到兩個方向的PCA降維(即行和列兩個方向)。

4.

(1)PCA的Python實現:

##Python實現PCA
import numpy as np
def pca(X,k):#k is the components you want
  #mean of each feature
  n_samples, n_features = X.shape
  mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
  #normalization
  norm_X=X-mean
  #scatter matrix
  scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
  #Calculate the eigenvectors and eigenvalues
  eig_val, eig_vec = np.linalg.eig(scatter_matrix)
  eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
  # sort eig_vec based on eig_val from highest to lowest
  eig_pairs.sort(reverse=True)
  # select the top k eig_vec
  feature=np.array([ele[1] for ele in eig_pairs[:k]])
  #get new data
  data=np.dot(norm_X,np.transpose(feature))
  return data

X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

print(pca(X,1))

 

(2)用sklearn的PCA與我們的PCA做個比較:

##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)
pca.fit(X)
print(pca.transform(X))

4. PCA的物理意義

PCA有兩種通俗易懂的解釋:(1)最大方差理論;(2)最小化降維造成的損失。這兩個思路都能推導出同樣的結果。

 

4.1  PCA算法優點

1,僅僅需要以方差衡量信息量,不受數據集以外的因素影響

2,各主成分之間正交,可消除原始數據成分間的相互影響的因素

3,計算方法簡單,主要運算時特征值分解,易於實現

4.2  PCA算法缺點

1,主成分各個特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強

2,方差小的非主成分也可能含有對樣本差異的重要信息,因降維丟棄可能對后續數據處理有影響

 

5.維度K(主成分的個數) 調參實戰


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: