PCA降維


概念

在機器學習中經常會碰到一些高維的數據集,而在高維數據情形下會出現數據樣本稀疏,距離計算等困難,這類問題是所有機器學習方法共同面臨的嚴重問題,稱之為“ 維度災難 ”。另外在高維特征中容易出現特征之間的線性相關,這也就意味着有的特征是冗余存在的。基於這些問題,降維思想就出現了。

降維方法有很多,而且分為線性降維和非線性降維,本篇文章主要講解線性降維中的主成分分析法(PCA)降維。顧名思義,就是提取出數據中主要的成分,是一種數據壓縮方法,常用於去除噪聲、數據預處理,是機器學習中常見的降維方法。

PCA的本質就是找一些投影方向,使得數據在這些投影方向上的方差最大,而且這些投影方向是相互正交的。這其實就是找新的正交基的過程,計算原始數據在這些正交基上投影的方差,方差越大,就說明在對應正交基上包含了更多的信息量。可以證明原始數據協方差矩陣的特征值越大,對應的方差越大,在對應的特征向量上投影的信息量就越大。

PCA的全部工作簡單點說,就是對原始的空間中順序地找一組相互正交的坐標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第1、2個軸正交的平面中方差最大的,這樣假設在N維空間中,我們可以找到N個這樣的坐標軸,我們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數據的損失最小。

因此,關鍵點就在於:如何找到新的投影方向使得原始數據的“信息量”損失最少?

樣本的“信息量”指的是樣本在特征方向上投影的方差。方差越大,則樣本在該特征上的差異就越大,因此該特征就越重要。在分類問題里,樣本的方差越大,越容易將不同類別的樣本區分開。

如上圖中共有3個類別的數據,很顯然,方差越大,越容易分開不同類別的點。樣本在X軸上的投影方差較大,在Y軸的投影方差較小。方差最大的方向應該是中間斜向上的方向(圖中紅線方向)。如果將樣本按照中間斜向上的方向進行映射,則只要一維的數據就可以對其進行分類,相比二維的原數據,就相當降了一維。

在原始數據更多維的情況下,先得到一個數據變換后方差最大的方向,然后選擇與第一個方向正交的方向,該方向是方差次大的方向,如此下去,直到變換出與原特征個數相同的新特征或者變換出前N個特征(在這前N個特征包含了數據的絕大部分信息)。

參考文獻中可以具體了解到前\(n\)個大特征值對應的特征向量,就是前n個主成分,而且主成分\(\xi_i\)對應的方差\(var(\xi_i)\)即等於協方差矩陣的特征值\(v\)

在多數情況下,數據的不部分方差集中在較少的幾個主成分上,因此,通常一般計算前\(k\)個主成分就可以了。前\(k\)個主成分所代表的\(n\)維原始數據全部方差的比例是

\[\frac{\sum_{i=1}^k v_i}{\sum_{i=1}^n v_i} \]

通過方差的百分比來計算將數據降到多少維是比較合適的。

方差是用來描述一維數據的,而協方差可以用來描述多維數據,方差的定義如下:

\[var(x) = \frac{\sum_{i=1}^n (x_i -\bar x)^2}{n-1} \]

相似的,兩個變量的協方差定義如下:

\[cov(x, y) = \frac{\sum_{i=1}^n (x_i -\bar x)(y_i - \bar y)}{n - 1} \]

式中分母是\(n-1\)而不是\(n\),是因為這樣就能夠使用樣本的協方差的期望值去更好地逼近總體的協方差,即"無偏估計"。當變量多於兩維時,就需要協方差矩陣了。協方差矩陣就是計算多個協方差,變量兩兩之間計算協方差,因為協方差具有"對稱性",即\(cov(x, y) = cov(y, x)\),所以對於一個\(n\)維的數據集的協方差矩陣,需要計算\(\frac{C^2_n}{2}\)次協方差,而且這個矩陣是對稱的。假設數據是3維的,它的協方差矩陣如下:

\[\sum = \begin{pmatrix} cov(x, x) & cov(x, y) & cov(x, z) \\ ... & cov(y ,y) & cov(y, z) \\ ... & ... & cov(z, z) \\ \end{pmatrix} \]

總之,PCA就是用一個超平面對所有樣本進行恰當的表達,這個超平面的維度小於原始維度,所以總是不可避免的會丟失一些信息,所以這也是PCA的缺點。該超平面應該具有以下性質:

  • 最近重構性:樣本點到這個超平面的距離都足夠近;
  • 最大可分性:樣本點在這個超平面上的投影能盡量分開。

這兩種性質能夠得到等價推導。

計算過程

算法步驟:
0. 設有m條n維數據。

  1. 將原始數據按列組成n行m列矩陣X
  2. 將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值
  3. 求出協方差矩陣
  4. 求出協方差矩陣的特征值及對應的特征向量
  5. 將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P
  6. 即為降維到k維后的數據

PCA計算舉例

使用Demo

from sklearn.decomposition import PCA
import numpy as np
from sklearn.preprocessing import StandardScaler

x = np.array([[10001, 2, 55], [16020, 4, 11], [12008, 6, 33], [13131, 8, 22]])
# 標准化,可取消
X_scaler = StandardScaler()
x = X_scaler.fit_transform(x)
print(x, "\n")
# PCA
pca = PCA(n_components=0.9)  # 保證降維后的數據保持90%的信息
pca.fit(x)
print(pca.transform(x))
"""
輸出:
 [ 1.48440157 -0.4472136  -1.18321596]
 [-0.35938143  0.4472136   0.16903085]
 [ 0.15671236  1.34164079 -0.50709255]]

[[ 2.36863319  0.38298087]
 [-1.50952734  1.23481789]
 [ 0.14360068 -0.58040917]
 [-1.00270653 -1.03738959]]
"""

PCA方法參數n_components,如果設置為整數\(x\),則表示將數據降至\(x\)維,如果是小數,則表明降維后保留的信息量比例。

參考鏈接

PCA 降維及python 實現
python 主成分分析(PCA)降維
PCA 數學原理
PCA 計算舉例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM