主成成分分析(Principal Component Analysis)

PCA是一種無監督的降低數據維度的方法。降維的過程當中,只需要特徵X而不需要標籤y。

1. 爲什麼需要PCA

如果數據的維度很少,則可以將數據直接用於分類計算。但是如果數據量比較大,比如圖像處理中,數據的維度常常達到上萬甚至更高。這是計算的成本就會很高。對於兩個冗餘的特徵,也需要進行提出。如果特徵的數量遠遠大於樣本的數量,也很有可能會形成過擬合問題。因此需要對一些具有強相關性的特徵進行剔除。比如學生的成績排名和分數等等。

PCA正是一種能夠將n維度特徵映射到k維上的方法(k < n)。PCA尋求一種方法,能夠在損失信息量最少的情況下實現維度的降低。這k維是全新的正交特徵,是重新構造出來的k維新特徵,而不是簡單地從n維特徵中取出n-k維特徵。

2. PCA計算過程

2.1 按照特徵來計算每個特徵的平均值和標準差

假設拿到的數據爲:

data=x11,x12,,x1nx21,x22,,x2nxm1,xm2,,xmn

即每行代表一個樣本,每列代表一個特徵。因此該數據有m行n列。因此我們需要計算每個特徵的平均值和標準差:
x¯j=1mi=1mxijj[1,n]σj=1mi=1m(xijx¯j)2

然後將每個樣本對應的特徵減去對應的均值,得到
data=x11x¯1σ1,x12x¯2σ2,,x1nx¯nσnx21x¯1σ1,x22x¯2σ2,,x2nx¯nσnxm1x¯1σ1,xm2x¯2σ2,,xmnx¯nσn

2.2 對於轉化後的數據data 求協方差矩陣

假設有n個特徵,則協方差矩陣爲:

COV=cov(x1,x1),cov(x1,x2),,cov(x1,xn)cov(x2,x1),cov(x2,x2),,cov(x2,xn)cov(xn,x1),cov(xn,x2),,cov(xn,xn)

是一個n×n 的對稱方陣,對角爲cov(xi,xi) ,是特徵xi 的方差,非對角線爲特徵xixj 的協方差。

2.3 計算協方差矩陣的特徵值和特徵向量

通過對矩陣COV 求特徵值EigenValue 和特徵向量EigenVector
特徵值和特徵向量求法及意義見:

2.4 選擇k維向量

將矩陣的特徵值按照從大到小排序,選擇其中最大的k個特徵值,然後將k個特徵值對應的特徵向量分別作爲列向量組成特徵向量矩陣,再將樣本點投影到選取的特徵向量上,新得到的數據矩陣爲:

data′′(m×k)=data(m×n)×EigenVector(n×k)

其中m 爲樣本數量,n 爲特徵數量,k 爲需要降到的維度。data′′ 爲降維以後的數據,data 爲原始數據減去均值以後的矩陣,EigenVector(n×k) 爲k個特徵向量組成的矩陣。則新的數據矩陣data′′ 即爲PCA 降維之後的矩陣。

2.5 計算實例

設原始數據爲:

x y
2.5 2.4
0.5 0.7
2.2 2.9
1.9 2.2
3.1 3.0
2.3 2.7
2 1.6
1 1.1
1.5 1.6
1.1 0.9

經過均值和方差處理後的數據爲:

x y
0.69 0.49
-1.31 -1.21
0.39 0.99
0.09 0.29
1.29 1.09
0.49 0.79
0.19 -0.31
-0.81 -0.81
-0.31 -0.31
0.71 -1.01

協方差矩陣爲:

COV=[0.6166,0.61540.6154,0.7166]

求得特徵值爲:
EigenValue=[0.04911.2840]

特徵向量爲:
EigenVector(2×1)=EigenValue=[0.7352,0.67790.6779,0.7352]

降維後的矩陣爲:
data′′=data(10×2)×EigenVector(2×1)=0.8281.7780.9920.2741.6750.9130.9911.1450.4381.1.224

這樣就將原始的n維特徵變成了k維,這k維就是原始特徵在k維上的投影。如下圖:
這裏寫圖片描述
斜着的兩條線就分別是正交的特徵向量(由於協方差矩陣是對稱的,因此其特徵向量正交),最後一步的矩陣乘法就是將原始樣本點分別往特徵向量對應的軸上做投影。
如果取k=2,則結果爲:
這裏寫圖片描述
整個過程看起來就像將座標系做了旋轉,當然二維可以圖形化表示,高維就不行了。上面的如果k=1,那麼只會留下這裏的水平軸,軸上是所有點在該軸的投影。

3. PCA的理論意義

3.1 最大方差理論

在信號處理中認爲信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。如前面的圖,樣本在橫軸上的投影方差較大,在縱軸上的投影方差較小,那麼認爲縱軸上的投影是由噪聲引起的。

因此我們認爲,最好的k維特徵是將n維樣本點轉換爲k維後,每一維上的樣本方差都很大。並且方差越大,攜帶的信息量就越大。

3.2 最小平方誤差

假設有這樣的二維樣本點(紅色點),回顧我們前面探討的是求一條直線,使得樣本點投影到直線上的點的方差最大。本質是求直線,那麼度量直線求的好不好,不僅僅只有方差最大化的方法。再回想我們最開始學習的線性迴歸等,目的也是求一個線性函數使得直線能夠最佳擬合樣本點,那麼我們能不能認爲最佳的直線就是迴歸後的直線呢?迴歸時我們的最小二乘法度量的是樣本點到直線的座標軸距離。比如這個問題中,特徵是x,類標籤是y。迴歸時最小二乘法度量的是距離d。如果使用迴歸方法來度量最佳直線,那麼就是直接在原始樣本上做迴歸了,跟特徵選擇就沒什麼關係了。

4. PCA的優缺點

根據上面對PCA的數學原理的解釋,我們可以瞭解到一些PCA的能力和限制。PCA本質上是將方差最大的方向作爲主要特徵,並且在各個正交方向上將數據“離相關”,也就是讓它們在不同正交方向上沒有相關性。

4.1 優點:

PCA技術的一大好處是對數據進行降維的處理。我們可以對新求出的“主元”向量的重要性進行排序,根據需要取前面最重要的部分,將後面的維數省去,可以達到降維從而簡化模型或是對數據進行壓縮的效果。同時最大程度的保持了原有數據的信息。

PCA技術的一個很大的優點是,它是完全無參數限制的。在PCA的計算過程中完全不需要人爲的設定參數或是根據任何經驗模型對計算進行干預,最後的結果只與數據相關,與用戶是獨立的。

PCA是一種無參數技術,也就是說面對同樣的數據,如果不考慮清洗,誰來做結果都一樣,沒有主觀參數的介入,所以PCA便於通用實現,但是本身無法個性化的優化。

4.2 缺點

如果用戶對觀測對象有一定的先驗知識,掌握了數據的一些特徵,卻無法通過參數化等方法對處理過程進行干預,可能會得不到預期的效果,效率也不高。

因此,PCA也存在一些限制,例如它可以很好的解除線性相關,但是對於高階相關性就沒有辦法了,對於存在高階相關性的數據,可以考慮Kernel PCA,通過Kernel函數將非線性相關轉爲線性相關,關於這點就不展開討論了。另外,PCA假設數據各主特徵是分佈在正交方向上,如果在非正交方向上存在幾個方差較大的方向,PCA的效果就大打折扣了。

pca只關注了輸入之間的correlation。(supervised) learning尋求的是輸入和輸出之間的聯繫。
想象一個極端情況:輸入的snr很低且噪聲強相關,但是被學習的系統有超強能力完全忽略噪聲。如果使用pca,估計很可能只保留了噪聲。

但是這個主要信息,仍然是隻針對訓練集的,爲了更好的滿足訓練集。過擬合就是對訓練集表現的很好,但是對測試集表現的很差。同時,PCA保留的是訓練集的主要信息,可能這未必是重要信息,但是捨棄了一些看似無用的信息,那些信息仍可能是重要信息,只是在訓練集上沒有很大的表現。所以,降維可能加劇了過擬合,而沒有避免過擬合。

PCA是一種無監督學習,其存在的假設是:方差越大信息量越多。但是信息(方差)小的特徵並不代表表對於分類沒有意義,可能正是某些方差小的特徵直接決定了分類結果,而PCA在降維過程中完全不考慮目標變量的做法會導致一些關鍵但方差小的分類信息被過濾掉。

由於PCA整個方案都沒用到y,所以過擬合問題並不能用PCA來降維攻擊。

類似於PCA和auto-encoder這樣的無監督方法,提取的特徵不會太差、但也不會太好,它最大的作用,是總結出一些關於X的較高層次的抽象知識、爲之後的有監督訓練提供一個比原始特徵空間更好的起點。實際上,無監督最具優勢之處,就在於它的通用性:不管y是什麼,只要有X就行,之後可以在各種各樣的y上進一步訓練。有證據顯示,人類在嬰兒時期也是先有一個無監督學習階段,然後纔是各種有監督學習。

PCA是高維環境下能想到的最直接的方案。比如人臉識別,維度往往成千上萬,但識別身份的話,每個人樣本最多也就幾十,過擬合現象是很嚴重的。由此產生了人臉識別早期研究中影響力極大的工作eigenface,其實就是先用PCA對人臉圖像進行降維,然後再訓練分類器。

參考資料:

5. 使用scikit-learn實現PCA

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaboran as sns
sns.set()
%matplotlib inline
from skleran.decomposition import PCA

np.random.seed(1)
X = np.dot(np.random.random(size=(2,2)), np.random.normal(size=(2, 200)))
plt.plot(X[:, 0], X[:, 1], "og")
plt.axis("equal")

# 如果n_components爲float,表示的是要保存多少的數據量,最終會保留的特徵數量爲比total_components*float(n_components)小的最大整數
pca = PCA(n_components=2)
pca.fit(X)
print(pca.explained_variance_)  # 按照從大到小排序的n_components個特徵值
print(pca.components_)  # 主成分軸,是Eigen Vector的轉置,shape爲(n_component, n_features),按照特徵向量(Eigen Value)來排序

plt.plot(X[:, 0], X[:, 1], "og", alpha=0.3)

X_trans = pca.fit_transform(X)  # 得到降維後的數據
X_new = pca.inverse_trainsform(X_trans)  #還原回原來的座標軸
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章