從特征分解到協(xié)方差矩陣:詳細(xì)剖析和實(shí)現(xiàn)PCA算法
本文先簡(jiǎn)要明了地介紹了特征向量和其與矩陣的關(guān)系,然后再以其為基礎(chǔ)解釋協(xié)方差矩陣和主成分分析法的基本概念,***我們結(jié)合協(xié)方差矩陣和主成分分析法實(shí)現(xiàn)數(shù)據(jù)降維。本文不僅僅是從理論上闡述各種重要概念,同時(shí)***還一步步使用 Python 實(shí)現(xiàn)數(shù)據(jù)降維。
首先本文的特征向量是數(shù)學(xué)概念上的特征向量,并不是指由輸入特征值所組成的向量。數(shù)學(xué)上,線性變換的特征向量是一個(gè)非簡(jiǎn)并的向量,其方向在該變換下不變。該向量在此變換下縮放的比例稱(chēng)為特征值。一個(gè)線性變換通??梢杂善涮卣髦岛吞卣飨蛄客耆枋觥H绻覀儗⒕仃嚳醋魑锢磉\(yùn)動(dòng),那么最重要的就是運(yùn)動(dòng)方向(特征向量)和速度(特征值)。因?yàn)槲锢磉\(yùn)動(dòng)只需要方向和速度就可以描述,同理矩陣也可以?xún)H使用特征向量和特征值描述。
其實(shí)在線性代數(shù)中,矩陣就是一個(gè)由各種標(biāo)量或變量構(gòu)成的表格,它和 Excel 表格并沒(méi)有什么本質(zhì)上的區(qū)別。只不過(guò)數(shù)學(xué)上定義了一些矩陣間的運(yùn)算,矩陣運(yùn)算的法則和實(shí)際內(nèi)部的值并沒(méi)有什么關(guān)系,只不過(guò)定義了在運(yùn)算時(shí)哪些位置需要進(jìn)行哪些操作。因?yàn)榫仃囅喈?dāng)于定義了一系列運(yùn)算法則的表格,那么其實(shí)它就相當(dāng)于一個(gè)變換,這個(gè)變換(物理運(yùn)動(dòng))可以由特征向量(方向)和特征值(速度)完全描述出來(lái)。
線性變換
在解釋線性變換前,我們需要先了解矩陣運(yùn)算到底是什么。因?yàn)槲覀兛梢詫?duì)矩陣中的值統(tǒng)一進(jìn)行如加法或乘法等運(yùn)算,所以矩陣是十分高效和有用的。如下所示,如果我們將向量 v 左乘矩陣 A,我們就會(huì)得到新的向量 b,也即可以表述說(shuō)矩陣 A 對(duì)輸入向量 v 執(zhí)行了一次線性變換,且線性變換結(jié)果為 b。因此矩陣運(yùn)算 Av = b 就代表向量 v 通過(guò)一個(gè)變換(矩陣 A)得到向量 b。下面的實(shí)例展示了矩陣乘法(該類(lèi)型的乘法稱(chēng)之為點(diǎn)積)是怎樣進(jìn)行的:
所以矩陣 A 將向量 v 變換為向量 b。下圖展示了矩陣 A 如何將更短更低的向量 v 映射到更長(zhǎng)更高的向量 b:
我們可以饋送其他正向量到矩陣 A 中,每一個(gè)饋送的向量都會(huì)投影到新的空間中且向右邊變得更高更長(zhǎng)。
假定所有的輸入向量 V 可以排列為一個(gè)標(biāo)準(zhǔn)表格,即:
而矩陣可以將所有的輸入向量 V 投影為如下所示的新空間,也即所有輸出向量組成的 B:
下圖可以看到輸入向量空間和輸出向量空間的關(guān)系,
如果假設(shè)矩陣就是一陣風(fēng),它通過(guò)有形的力量得出可見(jiàn)的結(jié)果。而這一陣風(fēng)所吹向的方向就是特征向量,因此特征向量就表明矩陣所要變換的方向。
如上圖所示,特征向量并不會(huì)改變方向,它已經(jīng)指向了矩陣想要將所有輸入向量都推向的方向。因此,特征向量的數(shù)學(xué)定義為:存在非零矩陣 A 和標(biāo)量λ,若有向量 x 且滿足以下關(guān)系式,那么 x 就為特征向量、λ為特征值。
特征向量同樣是線性變換的不變軸,所有輸入向量沿著這條軸壓縮或延伸。線性變換中的線性正是表明了這種沿直線軸進(jìn)行變換的特性,一般來(lái)說(shuō)幾階方陣就有幾個(gè)特征向量,如 3*3 矩陣有 3 個(gè)特征向量,n 階方陣有 n 個(gè)特征向量,每一個(gè)特征向量表征一個(gè)維度上的線性變換方向。
因?yàn)樘卣飨蛄刻崛〕隽司仃囎儞Q的主要信息,因此它在矩陣分解中十分重要,即沿著特征向量對(duì)角化矩陣。因?yàn)檫@些特征向量表征著矩陣的重要特性,所以它們可以執(zhí)行與深度神經(jīng)網(wǎng)絡(luò)中自編碼器相類(lèi)似的任務(wù)。引用 Yoshua Bengio 的話來(lái)說(shuō):
許多數(shù)學(xué)對(duì)象可以通過(guò)分解為更基礎(chǔ)的組成部分而有更好的理解,因?yàn)槲覀儠?huì)發(fā)現(xiàn)它們的一些廣泛性屬性,而不是我們選擇表征它們的特性。例如整數(shù)可以分解為質(zhì)因數(shù),雖然我們表征整數(shù)的方式會(huì)因?yàn)椴捎枚M(jìn)制還是十進(jìn)制而改變,但整數(shù)總可以由幾個(gè)質(zhì)因數(shù)表示(如 12=2 × 2 × 3),因此這種分解的性質(zhì)正好是我們所需要的穩(wěn)定性質(zhì)。
我們可以分解一個(gè)整數(shù)為質(zhì)因數(shù)而得到其自然屬性,同樣我們也可以分解矩陣以得到它的功能性屬性,并且這種屬性信息在矩陣表示為多組元素的陣列下是不明顯的。矩陣分解最常見(jiàn)的是特征分解(eigen-decomposition),即我們將矩陣分解為一系列的特征向量和特征值。
主成分分析(PCA)
PCA 是一種尋找高維數(shù)據(jù)(圖像等)模式的工具。機(jī)器學(xué)習(xí)實(shí)踐上經(jīng)常使用 PCA 對(duì)輸入神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)進(jìn)行預(yù)處理。通過(guò)聚集、旋轉(zhuǎn)和縮放數(shù)據(jù),PCA 算法可以去除一些低方差的維度而達(dá)到降維的效果,這樣操作能提升神經(jīng)網(wǎng)絡(luò)的收斂速度和整體效果。
為了進(jìn)一步了解 PCA 算法,我們還需要定義一些基本的統(tǒng)計(jì)學(xué)概念,即均值、標(biāo)準(zhǔn)差、方差和協(xié)方差。
樣本均值可簡(jiǎn)單的表示為所有樣本 X 的平均值,如下所示樣本均值表示為:
樣本標(biāo)準(zhǔn)差即樣本方差的平方根。即每一樣本點(diǎn)到樣本均值之間的平均距離。n 個(gè)樣本的方差卻只除以 n-1 是因?yàn)闃颖局皇钦鎸?shí)分布的估計(jì)量,樣本方差也只是真實(shí)方差的估計(jì)量。在大學(xué)課本概率論和數(shù)理統(tǒng)計(jì)中有證明,如果除以 n(2 階中心矩),那么樣本方差是真實(shí)方差的一致性估計(jì),但并不是無(wú)偏估計(jì),也就是樣本方差存在系統(tǒng)偏差。因此我們需要對(duì) 2 階中心矩進(jìn)行調(diào)整以消除系統(tǒng)偏差。如下所示,樣本的標(biāo)準(zhǔn)差 s 和方差 var(X) 都是無(wú)偏估計(jì):
因?yàn)闃颖緲?biāo)準(zhǔn)差和方差都是先求距離的平方再求平方根,因此距離一定是正數(shù)且不會(huì)抵消。假設(shè)我們有如下數(shù)據(jù)點(diǎn)(散點(diǎn)圖):
PCA 如線性回歸那樣會(huì)嘗試構(gòu)建一條可解釋性的直線貫穿所有數(shù)據(jù)點(diǎn)。每一條直線表示一個(gè)「主成分」或表示自變量和因變量間的關(guān)系。數(shù)據(jù)的維度數(shù)就是主成分的數(shù)量,也即每一個(gè)數(shù)據(jù)點(diǎn)的特征維度。PCA 的作用就是分析這些特征,并選出最重要的特征。PCA 本質(zhì)上是將方差***的方向作為主要特征,并且在各個(gè)正交方向上將數(shù)據(jù)「去相關(guān)」,也就是讓它們?cè)诓煌环较蛏蠜](méi)有相關(guān)性。通常我們認(rèn)為信息具有較大的方差,而噪聲有較小的方差,信噪比就是信號(hào)與噪聲的方差比,所以我們希望投影后的數(shù)據(jù)方差越大越好。因此我們認(rèn)為,***的 k 維特征是將 n 維樣本點(diǎn)轉(zhuǎn)換為 k 維后,每一維上的樣本方差都很大。
如下圖所示,***個(gè)主成分以直線(紅色)的形式將散點(diǎn)圖分為兩邊,并且它是保留了***方差的。因?yàn)橥队暗竭@條直線(紅色)上數(shù)據(jù)點(diǎn)離均值(空心點(diǎn))有***的方差,即所有藍(lán)點(diǎn)到灰色線的平均距離為***方差,所以這一個(gè)主成分將保留最多的信息。
如上所示,假設(shè)第二個(gè)主成分為垂直于紅線(***個(gè)主成分)的灰色線。當(dāng)數(shù)據(jù)點(diǎn)投影到第二個(gè)主成分上時(shí),它們離樣本均值(空心點(diǎn))的方差卻非常小,即數(shù)據(jù)點(diǎn)到紅色線的平均距離。所以紅色線是***的主成分。
協(xié)方差矩陣
前面我們已經(jīng)了解矩陣其實(shí)就是一種將某個(gè)向量變換為另一個(gè)的方法,另外我們也可以將矩陣看作作用于所有數(shù)據(jù)并朝向某個(gè)方向的力。同時(shí)我們還知道了變量間的相關(guān)性可以由方差和協(xié)方差表達(dá),并且我們希望保留***方差以實(shí)現(xiàn)***的降維。因此我們希望能將方差和協(xié)方差統(tǒng)一表示,并且兩者均可以表示為內(nèi)積的形式,而內(nèi)積又與矩陣乘法密切相關(guān)。因此我們可以采用矩陣乘法的形式表示。若輸入矩陣 X 有兩個(gè)特征 a 和 b,且共有 m 個(gè)樣本,那么有:
如果我們用 X 左乘 X 的轉(zhuǎn)置,那么就可以得出協(xié)方差矩陣:
這個(gè)矩陣對(duì)角線上的兩個(gè)元素分別是兩特征的方差,而其它元素是 a 和 b 的協(xié)方差。兩者被統(tǒng)一到了一個(gè)矩陣的,因此我們可以利用協(xié)方差矩陣描述數(shù)據(jù)點(diǎn)之間的方差和協(xié)方差,即經(jīng)驗(yàn)性地描述我們觀察到的數(shù)據(jù)。
尋找協(xié)方差矩陣的特征向量和特征值就等價(jià)于擬合一條能保留***方差的直線或主成分。因?yàn)樘卣飨蛄孔粉櫟搅酥鞒煞值姆较?,?**方差和協(xié)方差的軸線表明了數(shù)據(jù)最容易改變的方向。根據(jù)上述推導(dǎo),我們發(fā)現(xiàn)達(dá)到優(yōu)化目標(biāo)就等價(jià)于將協(xié)方差矩陣對(duì)角化:即除對(duì)角線外的其它元素化為 0,并且在對(duì)角線上將特征值按大小從上到下排列。協(xié)方差矩陣作為實(shí)對(duì)稱(chēng)矩陣,其主要性質(zhì)之一就是可以正交對(duì)角化,因此就一定可以分解為特征向量和特征值。
當(dāng)協(xié)方差矩陣分解為特征向量和特征值之后,特征向量表示著變換方向,而特征值表示著伸縮尺度。在本例中,特征值描述著數(shù)據(jù)間的協(xié)方差。我們可以按照特征值的大小降序排列特征向量,如此我們就按照重要性的次序得到了主成分排列。
對(duì)于 2 階方陣,一個(gè)協(xié)方差矩陣可能如下所示:
在上面的協(xié)方差矩陣中,1.07 和 0.64 分別代表變量 x 和變量 y 的方差,而副對(duì)角線上的 0.63 代表著變量 x 和 y 之間的協(xié)方差。因?yàn)閰f(xié)方差矩陣為實(shí)對(duì)稱(chēng)矩陣(即 Aij=Aji),所以其必定可以通過(guò)正交化相似對(duì)角化。因?yàn)檫@兩個(gè)變量的協(xié)方差為正值,所以這兩個(gè)變量的分布成正相關(guān)性。如下圖所示,如果協(xié)方差為負(fù)值,那么變量間就成負(fù)相關(guān)性。
注意如果變量間的協(xié)方差為零,那么變量是沒(méi)有相關(guān)性的,并且也沒(méi)有線性關(guān)系。因此,如果兩個(gè)變量的協(xié)方差越大,相關(guān)性越大,投影到主成分后的損失就越小。我們同時(shí)可以考慮協(xié)方差和方差的計(jì)算式而了解他們的關(guān)系:
計(jì)算協(xié)方差的優(yōu)處在于我們可以通過(guò)協(xié)方差的正值、負(fù)值或零值考察兩個(gè)變量在高維空間中相互關(guān)系??偟膩?lái)說(shuō),協(xié)方差矩陣定義了數(shù)據(jù)的形狀,協(xié)方差決定了沿對(duì)角線對(duì)稱(chēng)分布的強(qiáng)度,而方差決定了沿 x 軸或 y 軸對(duì)稱(chēng)分布的趨勢(shì)。
基變換
因?yàn)閰f(xié)方差矩陣的特征向量都是彼此正交的,所以變換就相當(dāng)于將 x 軸和 y 軸兩個(gè)基軸換為主成分一個(gè)基軸。也就是將數(shù)據(jù)集的坐標(biāo)系重新變換為由主成分作為基軸的新空間,當(dāng)然這些主成分都保留了***的方差。
我們上面所述的 x 軸和 y 軸稱(chēng)之為矩陣的基,即矩陣所有的值都是在這兩個(gè)基上度量而來(lái)的。但矩陣的基是可以改變的,通常一組特征向量就可以組成該矩陣一組不同的基坐標(biāo),原矩陣的元素可以在這一組新的基中表達(dá)。
在上圖中,我們展示了相同向量 v 如何在不同的坐標(biāo)系中有不同的表達(dá)。黑色實(shí)線代表 x-y 軸坐標(biāo)系而紅色虛線是另外一個(gè)坐標(biāo)系。在***個(gè)坐標(biāo)系中 v = (1,1),而在第二個(gè)坐標(biāo)系中 v = (1,0)。因此矩陣和向量可以在不同坐標(biāo)系中等價(jià)變換。在數(shù)學(xué)上,n 維空間并沒(méi)有唯一的描述,所以等價(jià)轉(zhuǎn)換矩陣的基也許可以令問(wèn)題更容易解決。
***我們簡(jiǎn)單地總結(jié)一下 PCA 算法的基本概念和步驟:
首先我們得理解矩陣就相當(dāng)于一個(gè)變換,變換的方向?yàn)樘卣飨蛄?,變換的尺度為特征值。PCA 的本質(zhì)是將方差***的方向作為主要特征,并且在各個(gè)正交方向上將數(shù)據(jù)「去相關(guān)」,即讓它們?cè)诓煌环较蛏蠜](méi)有相關(guān)性。所以我們希望將最相關(guān)的特征投影到一個(gè)主成分上而達(dá)到降維的效果,投影的標(biāo)準(zhǔn)是保留***方差。而在實(shí)際操作中,我們希望計(jì)算特征之間的協(xié)方差矩陣,并通過(guò)對(duì)協(xié)方差矩陣的特征分解而得出特征向量和特征值。如果我們將特征值由大到小排列,相對(duì)應(yīng)的特征向量所組成的矩陣就是我們所需降維后的數(shù)據(jù)。下面我們將一步步實(shí)現(xiàn) PCA 算法。
輸入數(shù)據(jù):
- import numpy as np
- x=np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
- y=np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
歸一化數(shù)據(jù):
- mean_x=np.mean(x)
- mean_y=np.mean(y)
- scaled_x=x-mean_x
- scaled_y=y-mean_y
- data=np.matrix([[scaled_x[i],scaled_y[i]] for i in range(len(scaled_x))])
繪制散點(diǎn)圖查看數(shù)據(jù)分布:
- import matplotlib.pyplot as plt
- plt.plot(scaled_x,scaled_y,'o')
求協(xié)方差矩陣:
- cov=np.cov(scaled_x,scaled_y)
求協(xié)方差矩陣的特征值和特征向量:
- eig_val, eig_vec = np.linalg.eig(cov)
求出特征向量后,我們需要選擇降維后的數(shù)據(jù)維度 k(n 維數(shù)據(jù)降為 k 維數(shù)據(jù)),但我們的數(shù)據(jù)只有兩維,所以只能降一維:
- eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(len(eig_val))]
- eig_pairs.sort(reverse=True)
- feature=eig_pairs[0][1]
轉(zhuǎn)化得到降維后的數(shù)據(jù):
- new_data_reduced=np.transpose(np.dot(feature,np.transpose(data))
原文:
https://deeplearning4j.org/eigenvector#a-beginners-guide-to-eigenvectors-pca-covariance-and-entropy
【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】