機器學習_用PCA主成分分析給資料降維

xieyan0811發表於2017-11-21

 有時我們的資料中包括很多屬性,有些是沒意義的,有些是重複的,有些組合後意義更明顯。此時,我們需要簡化屬性節約算力,去噪,去冗餘,求取更典型的屬性,同時又希望不損失資料本身的意義。
 主成分分析(Principal Component Analysis,PCA),是一種統計方法。通過正交變換將一組可能存在相關性的變數轉換為一組線性不相關的變數,轉換後的這組變數叫主成分。資料分析中常使用PCA給資料降維,它能在指定的損失範圍內最大的簡化屬性。本篇將介紹PCA的原理,Python實現及應用場景。

1. 特徵值與特徵向量

 PCA的核心演算法是:協方差矩陣和特徵值分解,先來看看特徵值分解相關的知識點。

1) 基

 我們無時無刻不用到基,十進位制就是以10為基底的描述,一個小時60分鐘,60就是基底,再說複雜一點,傅立葉變換中,餘弦(或正弦)波是基底,小波變換中小波是基底,可以把它理解成一種基本的參照,比如1公斤,1海里,1升…
 一個點在宇宙中本沒有座標,但只要定義了基,它就能被描述。任何的東西都可以藉助基來描述。但不管使用什麼樣的基,上層的實體(邏輯關係)是不變的。比如,珠峰的高度=8848米=8.848千米,實體(高度)並沒有改變,只是換了一種表述的方式。這裡單位千米對應的就是基底,而數值對應的是座標,描述的是向線段。

2) 座標系

 我們可以把不同座標理解成不同的視角,比如兩人看同一場電影,A坐在第一排最左邊,B坐在最後一排的正中間。他們看到的是同一個等腰直角三角形(人腦會自動對三維空間做一些校正,所以真實世界中我們感覺變形並不明顯)。但如果脫離了螢幕,單看左邊的三角形,會難以描述它。而B的視角是直角座標系,且三角形的兩邊與座標軸垂直。同樣是把它拉長的操作,在B視角延座標軸的縮放即可,它比A視角描述和計算都更容易。不過無論坐在哪兒看到的都是同一部電影。

 為了簡化問題,也可以A移到B的視角,也就是轉換的是它的基,具體方法是線性變換,也就是乘矩陣。下圖是在座標系中的視角變換。

3) 矩陣相乘的意義

兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。圖形還是同一個圖形,只是變了視角。將結果乘它的逆矩陣又變回了原來的座標,於是,可以把複雜的變換拆分成:變視角->簡單變換->視角變回去。

4) 特徵值分解

先來看看特徵值,特徵向量到底長什麼樣?

i. 程式碼

import numpy as np
a = np.array([[2, -1], [-1, 2]]) # 矩陣
print np.linalg.eig(a) # 特徵值分解

ii. 執行結果

(array([ 3.,  1.]), 
array([[ 0.70710678,  0.70710678],
       [-0.70710678,  0.70710678]]))

iii. 分析
 執行結果的第一個陣列是特徵值,它是一個對角陣,所以只給出了對角線上的資料,第二個陣列是特徵矩陣。
 它將矩陣A的變換拆分成了:旋轉->拉伸->再轉回去



 其中P是負責旋轉到正交的座標系(各軸相互垂直)的“特徵向量”,而 則是負責拉伸的“特徵值”,它在一個方向上拉伸了3倍,另一個方向拉伸了1倍。拉抻值大的,就是它的主方向。
 也可以把乘以特徵向量當成正交分解。從物理角度上講,是將一個力分解為Fx和Fy兩個相互垂直的分力的方法,叫作力的正交分解。在這裡是把矩陣分解成由特徵向量指定的垂直(正交)的座標系中的分量。

2. 協方差矩陣

 協方差表達的是屬性與屬性間的相關程度,就是一個值變時,另一個值發生多大變化。
 公式是Cov[X,y]=E((X-E(X))(Y-E(Y))),E是期望值(重心),這裡先簡單看作均值(即每種可能出現概率一樣),每個X,Y都會多少偏離均值,當X和Y偏離方向總是一致是它們正相關,總是相反時負相關,不一定時無關。
協方差的值也會由於具體屬性值的大小而受影響,相關係數更進一步,它是用X、Y的協方差除以X的標準差和Y的標準差,因此我們也常用相關係數來判斷特徵之間的關係。
 協方差矩陣也有它解決不了的問題,它能判斷兩兩屬性間的關係,但遇到A,B共同決定C時就無能為力了,而且它只能表述線性關係,對於非線性也視為不相關(這就是為什麼不線性相關的屬性卻不一定相互獨立)
 PCA就是對協方差矩陣做特徵值分解。

3. PCA步驟

  • 去除平均值
    先求每個屬性的均值,然後將整個矩陣減去均值,為計算協方差做準備。
  • 計算協方差矩陣
    協方差矩陣是度量維度間的差異,而非樣本間差異。協方差矩陣的主對角線上的元素是各個維度上的方差
  • 計算協方差矩陣的特徵值和特徵向量
    對角化,使得除對角線外,其它元素為0,將能量歸於主要方向。
  • 將特徵值排序
  • 保留最大的N個特徵值
  • 將資料轉換到特徵向量構建的新空間中

4. 程式

from numpy import *
import matplotlib.pyplot as plt

def pca(dataMat, topNfeat=9999999): # 只何留特徵值最大的前topNfeat個特徵
    meanVals = mean(dataMat, axis=0) # 均值
    meanRemoved = dataMat - meanVals
    covMat = cov(meanRemoved, rowvar=0) # 協方差
    eigVals,eigVects=linalg.eig(mat(covMat)) # 計算特徵值、特徵向量
    eigValInd = argsort(eigVals) # 從小到大排序,返回索引值陣列
    eigValInd = eigValInd[:-(topNfeat+1):-1] # 保留後topNfeat個,然後調轉先後
    fig = plt.figure(0)
    plt.plot(eigVals) # 特徵值繪圖,看看前幾個最重要
    redEigVects = eigVects[:,eigValInd] # 按eigValInd排序和去掉列
    print(redEigVects)
    lowDDataMat = meanRemoved * redEigVects # 轉向新空間,行數不變,列按引數減少
    reconMat = (lowDDataMat * redEigVects.T) + meanVals # 再轉回舊空間
    return lowDDataMat, reconMat

5. 程式分析

1) 特徵值

 特徵值分解之後,特徵值越大說明該方向上的變化越大,越重要,反之不重要,則可以去掉,此方法可用於降維。如果對50維資料求特徵值,發現只有5個值較大,其它都非常小,則說明只需要考慮這5個綜合因素即可。
 分解將向量拆分成正交的線性組合,正交也保證了“綜合因素”的相互獨立。

2) 方差

 協方差矩陣的對角線就是各個特徵的方差,方差闡釋了資料的發散程度,在幾個維度中,某一維方差最大,說明資料在該軸上分佈得越廣,該軸就是覆蓋差異最大的座標軸。具體應用比如:在聚類問題中,我們更希望最後匯聚成發散的幾塊,而不是團在一起。因此可以考慮以方差最大的方向分成幾塊,作為聚類的初始點。

3) 協方差

 協方差Cov(X,Y)=E((X-E(X)(Y-E(Y))),其中E為期望值, E(XY),就是XY乘積的均值,是兩個變數總體誤差的期望。如果把均值作為0,而上下波動的誤差作為能量,則協方差就是能量的期望,協方差矩陣就是能量矩陣。它呈現的不是值的關係,而是變化的關係。具體應用比如:配置資產時,相關性高可能帶來更高風險,選擇獨立的資產配置,或負相關的,可以對衝風險。

6. 使用

  • PCA一般用於多維資料,它可以把N維資料轉到M維空間,比如50維變5維,運算量就少了很多。
  • PCA只是分析特徵間的關係,與結果無關,可視為一種無監督學習。
  • 雖然轉換後意義不夠直觀,但低維向量再乘特徵向量的逆矩陣,還可以轉回來。
  • 從協方差矩陣看各屬性的相互關係, 啟發得到一些重要屬性。
  • 可取到特徵值,通過其大小,判斷資訊量的多少。
  • 用PCA去噪的原理是,認為被去掉的那些小的特徵值是噪差干擾導致。
  • 上例只為說明原理,實際應用中,一般直接呼叫sklearn庫提供的PCA類


技術文章定時推送
請關注公眾號:演算法學習分享

相關文章