內(nèi)容概要:
- 矩陣奇異值分解SVD
- 主成分分析PCA及其應(yīng)用
- SVD與PCA之間的關(guān)系
1 矩陣奇異值分解SVD
1.1 矩陣奇異值分解的數(shù)學(xué)原理
在關(guān)于SVD(Singular Value Decomposition)的講解中將涉及稍微多一點的數(shù)學(xué)推導(dǎo)。
定義:設(shè)是秩為
的
矩陣束凑,
階對稱方陣
的特征值為
,且有
則稱
為矩陣的奇異值。
奇異值分解定理:設(shè)是秩為
的
矩陣蝗蛙,則存在
階正交矩陣
和
階正交矩陣
蚜厉,使得
其中矩陣
的分塊形式為
為A的奇異值
構(gòu)成的對角矩陣。
下面我們來證明這個定理技俐,并從這個過程中理解代表的含義雕擂。
證明:是一個實對稱矩陣,且有
贱勃,故存在
階正交矩陣
井赌,使得
其中
于是
因此有
令,則上式即為
贵扰,故
的列向量是單位正交向量組仇穗,將
擴充為
,則有
證畢戚绕。
下面我們來探索一下奇異值分解中各個量的含義纹坐,首先:
于是
這表示對矩陣
的分量作用后,得到的就是相應(yīng)的奇異值舞丛。
另外耘子,是
的列向量空間的一組正交基,證明如下:
首先球切,這證明了其正交性谷誓。另外,設(shè)
向量
由于是
維空間的一組標準正交基吨凑,故
于是
這表明片林,任何一個可由的列向量組線性表出的向量同樣可以由
線性表出。故
是
的列向量空間的一組正交基怀骤。
又由于,則
其實就是A的列空間的一組標準正交基焕妙,而
正是由這組標準正交基組成的矩陣蒋伦。
1.2 SVD分解實例
設(shè)有矩陣
試對其進行奇異值分解。
這里就不用手計算了(這個矩陣編的焚鹊,懶得算了)痕届,我們使用和
來幫助計算韧献,同樣也用其中的矩陣乘法來驗證分解的正確性。
import numpy as np
from scipy.linalg import svd
A = np.array([
[1,2],
[3,4],
[5,6]
])
U, s, VT = svd(A)
注意中間的我用的是小寫研叫,因為
計算
分解結(jié)果的
矩陣返回的是非零奇異值列表锤窑,而不是真正的
矩陣。
驗證分解的正確性即驗證
#先將s轉(zhuǎn)化為Sigma矩陣
Sigma = np.zeros(A.shape)
for i in range(len(s)):
Sigma[i][i] = s[i]
#print(Sigma)
# 驗證
print(U.dot(Sigma).dot(VT))
可見分解是正確的嚷炉。
2 主成分分析
主成分分析(Principal Component Analysis )是迄今為止機器學(xué)習(xí)領(lǐng)域最流行的降維算怯渊啰。它先是找出最接近數(shù)據(jù)特征的超平面,然后將數(shù)據(jù)投影其上申屹,以達到降維目的绘证。這樣說還是有點抽象,下面一步一步來講解PCA的數(shù)學(xué)原理哗讥,用數(shù)學(xué)知識推導(dǎo)一遍PCA嚷那。
2.1 向量與內(nèi)積
首先來看一個中學(xué)就學(xué)過的向量內(nèi)積運算:
兩個向量的內(nèi)積定義為:
這樣的內(nèi)積有什么含義呢?下面將內(nèi)積換一種寫法:
可以看到向量與
的內(nèi)積結(jié)果為
在
上投影的長度再乘以
的模杆煞,如果讓
的模為
魏宽,則:
即當(dāng)模為
時,
與
的內(nèi)積就是
在
上投影的長度决乎。
推廣至維空間队询,這樣,當(dāng)
為某組單位正交基中的一個時瑞驱,
與
的內(nèi)積就是
在該單位正交基上投影的長度娘摔。也就是相應(yīng)基方向上的坐標。
2.2 基唤反、坐標及其變換的矩陣表示
下面繼續(xù)討論凳寺,為了方便,我們以二維平面中的點或向量為例彤侍。
在上圖中肠缨,假設(shè)點(向量)的坐標為,這表示點(向量)在軸的投影距離原點為個單位長度盏阶,在軸的投影距離原點個單位長度晒奕,可見坐標其實是被我們賦予了含義的,顯式表示這層含義名斟,點可以表示為:
二維平面中的所有坐標都可以表示為:
這里和
就是二維平面的一組基脑慧,為了表示二維平面的一個向量,首先要確定一組基砰盐,然后給出在基所在的各個直線上的投影值闷袒,也就是坐標,不過由于平時見到的幾乎都是平面直角坐標系中岩梳,于是都默認
和
為基囊骤。
實際上晃择,任意兩個線性無關(guān)的向量都可以作為二維平面的一組基。不過為了研究問題的方便也物,一般我們希望基向量的墓溃可以是,而且如果是一組基滑蚯,它們之間最好是兩兩正交的浪蹂,因為投影得到各個基方向的坐標的投影方式都是垂直投影,這樣的基有非常良好的性質(zhì)膘魄。從前面對內(nèi)積的探討中也可以看出乌逐,選用模為
的基向量,我們的原向量坐標只需與新選取的基做內(nèi)積運算就可以得到該向量在新基下的坐標创葡,理解了這一點對理解下面推導(dǎo)PCA原理非常重要浙踢。
如我們選取標準正交基和
,則
在這組基下的坐標不難通過內(nèi)積計算得到
灿渴,圖示如下:
為了表示方便洛波,我們使用矩陣這一數(shù)學(xué)工具,將坐標變換表示為矩陣形式:
而且還能同時計算多個坐標變換后的結(jié)果:
其中等號左側(cè)左邊矩陣的行向量為直角坐標系下的坐標骚露,基(列向量)拼接為變換矩陣蹬挤,乘法的結(jié)果矩陣就是原直角坐標在新基下變換后的坐標。如果我們不取這組基中全部的基向量(這里二維情形我們只取一個)棘幸,這個乘法(內(nèi)積)操作就相當(dāng)于只在這個基上做了投影:
如果把各個坐標看做是特征矩陣中的某個數(shù)據(jù)項焰扳,這便達到了降維的目的,上面的例子是把二維特征降維到了一維误续。(注意:與數(shù)學(xué)中維度考慮秩不同吨悍,我們這里說的特征維度指的是特征的個數(shù)。)
更一般地蹋嵌,設(shè)有特征矩陣育瓜,其中
表示數(shù)據(jù)項的個數(shù),
表示每個數(shù)據(jù)項擁有的特征個數(shù)栽烂,想將其降維為
躏仇,只需要乘以行數(shù)等于
列數(shù)等于
的變換矩陣
:
注意這里的可以小于
,
的大小就決定了原特征矩陣變換后的特征維度腺办。也就是說我們可以把原本高維的特征變換到低緯度空間去研究焰手,當(dāng)然前提是不損失特征包含的信息。
從上述分析中也可以看到怀喉,兩個矩陣相乘的意義是將左邊矩陣中的每一個行向量變換到右邊矩陣中以列向量為一組基所表示的空間中去册倒,當(dāng)然實際上也可以看做對右邊矩陣中列向量的變換,不過這里討論PCA磺送,為了遷就特征矩陣表示上的習(xí)慣使用了這一方式驻子。
2.3 PCA降維問題的優(yōu)化目標
通過上面的討論我們知道可以選取新的基對數(shù)據(jù)重新進行表示,當(dāng)基的數(shù)目小于原特征數(shù)目時便可以達到數(shù)據(jù)降維的目的估灿,不過降維后的數(shù)據(jù)應(yīng)盡可能保留原數(shù)據(jù)中的信息崇呵,這樣的降維才有意義,現(xiàn)在的問題就是我們怎么選取一組基才能將數(shù)據(jù)降維并盡量保持原數(shù)據(jù)中的信息呢馅袁?要數(shù)學(xué)化這個問題并不那么簡單域慷,為了避免滿篇數(shù)學(xué)公式的推導(dǎo),我們用一個具體的例子汗销,設(shè)有5個數(shù)據(jù)項2個特征的特征矩陣如下:
為了后續(xù)處理方便犹褒,先將這組數(shù)據(jù)進行中心化,也就是讓每個特征的均值為0弛针,這只需特征的每個數(shù)據(jù)減去他們當(dāng)前的均值叠骑,這里第一個特征均值為,第二個特征均值為
削茁,于是將特征矩陣處理為:
這樣處理的好處我們會在后面看到≈婕希現(xiàn)在將這組數(shù)據(jù)在二維直角坐標系中畫出來:
現(xiàn)在要對這組數(shù)據(jù)進行特征降維,一個直觀的想法是投影到軸茧跋,也就是只取數(shù)據(jù)
軸的坐標(只保留一個特征)慰丛,不過此時我們發(fā)現(xiàn)有數(shù)據(jù)點重合,原本不同的數(shù)據(jù)無法再區(qū)分出來瘾杭,這個降維方案是失敗的诅病。顯然我們應(yīng)該選擇某個投影方向,使得數(shù)據(jù)點在該方向投影后(降維后)有最大的區(qū)分度粥烁,也就是投影后數(shù)值盡可能在該方向軸上分散贤笆。如將其投影到方向
(一三象限角平分線)上貌似就是個不錯的選擇:
在數(shù)學(xué)上我們有對這種分散程度更精確的刻畫,這種刻畫就是方差页徐。
2.3.1 方差與協(xié)方差
某個特征(特征矩陣的某一列)的方差計算公式為:
其中為數(shù)據(jù)項個數(shù)苏潜,
為他們的樣本均值。
需要指出的是变勇,在統(tǒng)計學(xué)上恤左,樣本方差計算是除以的,這是為了保證樣本方差是總體方差的無偏估計搀绣,不過在機器學(xué)習(xí)中大樣本情況下差別不大飞袋,所以本文討論中都采取除以
這種簡單的寫法。
實際運用中链患,都先把數(shù)據(jù)中心化巧鸭,均值,這樣方差計算將簡便的多:
于是上述二維降一維的問題就轉(zhuǎn)化為麻捻,尋找一個一維基纲仍,使得特征數(shù)據(jù)變換為這個基上的坐標表示后呀袱,方差值最大。
那如果是更高維的特征呢郑叠,現(xiàn)在考慮三維降二維問題夜赵。與之前相同,首先我們希望找到一個方向使得投影后方差最大乡革,這樣就完成了第一個方向的選擇寇僧,接著我們選擇第二個投影方向。如果我們還是單純只選擇方差最大的方向沸版,很明顯嘁傀,這個方向與第一個方向應(yīng)該是“幾乎重合在一起”,顯然這樣的維度是沒有用的视粮,因此细办,應(yīng)該有其他約束條件。從直觀上說馒铃,讓兩個特征盡可能表示更多的原始信息蟹腾,我們是不希望它們之間存在(線性)相關(guān)性的,因為相關(guān)性意味著兩個特征不是完全獨立区宇,存在重疊表示的信息娃殖。數(shù)學(xué)上可以用兩個字段的協(xié)方差表示其相關(guān)性:
由于我們已經(jīng)讓特征和
的均值為
,于是:
當(dāng)協(xié)方差為0時议谷,表示兩個字段完全不相關(guān)炉爆。為了讓協(xié)方差為0,我們選擇的第二個基時只能在與第一個基正交的方向上選擇卧晓。因此最終選擇的兩個方向一定是正交的芬首。于是三維降二維的最優(yōu)化問題便轉(zhuǎn)化為尋找兩個互相正交的基,使得原始三維特征變換到二維特征后逼裆,特征間協(xié)方差為郁稍,而特征內(nèi)的方差值則盡可能大。
至此我們不難得到更一般的降維問題的最優(yōu)化目標:將一組維特征降維為
維胜宇,其目標是選擇一組
個單位正交基耀怜,使得原始數(shù)據(jù)變換到這組基上后,各特征間兩兩協(xié)方差為0桐愉,而特征內(nèi)的方差則盡可能大(在正交的約束下财破,取最大的
個方差)。
2.3.2 協(xié)方差矩陣及其對角化
在上面的討論中我們看到从诲,我們要達到的最優(yōu)化目標與特征間協(xié)方差和特征內(nèi)方差都有密切關(guān)系左痢,如何將它們統(tǒng)一表示呢,那就是協(xié)方差矩陣,協(xié)方差矩陣的位置是特征
與
的協(xié)方差俊性,
位置是特征
自身的方差略步,由于已經(jīng)事先讓各個特征均值為0,無論方差還是協(xié)方差都是向量內(nèi)積的形式定页,設(shè)原特征矩陣經(jīng)過降維變換后的矩陣為
纳像,此時協(xié)方差矩陣其實就是:
原特征對應(yīng)的協(xié)方差矩陣:
那么與
有什么關(guān)系呢?下面我們就來計算一下拯勉,由于
是特征降維后的矩陣,故
一定是對角矩陣(協(xié)方差為
)憔购,于是:
這下事情清楚了宫峦,我們要找的一組正交基組成的變換矩陣正是可以使得原協(xié)方差矩陣
對角化所對應(yīng)的正交矩陣。而原協(xié)方差矩陣
是一個實對稱矩陣玫鸟,實對稱矩陣擁有非常良好的性質(zhì):
- 實對稱矩陣一定可以對角化导绷;
- 實對稱矩陣不同特征值對應(yīng)的特征向量互相正交;
- 實對稱矩陣的k重特征值對應(yīng)k個線性無關(guān)的特征向量屎飘;
我們可以通過實對稱矩陣對角化理論求出我們需要的變換矩陣妥曲。
原特征矩陣對角化后的矩陣
的對角線元素正是
的特征值(設(shè)這些特征值按從大到小的順序排列),由上面我們知道這里的特征值就是變換后各特征的方差钦购,其含義就是將原數(shù)據(jù)投影到該特征值對應(yīng)的特征向量方向后檐盟,新數(shù)據(jù)的重要程度,方差越大則數(shù)據(jù)越重要押桃。
一般我們只取的前
列
葵萎,代表變換后前
個最重要的特征所在的方向,而丟棄剩下的列
這便達到了降維的效果唱凯。
以上就是PCA的原理羡忘。怎么樣,夠清晰吧磕昼。
2.4 PCA降維在手寫數(shù)字數(shù)據(jù)集應(yīng)用實例
接下來卷雕,用一個機器學(xué)習(xí)實例來看一下PCA的強大之處。
我們使用手寫數(shù)字數(shù)據(jù)集票从,這個數(shù)據(jù)集共有個樣本漫雕,每個樣本都擁有784個特征(每個樣本就是一張
的手寫數(shù)字圖像)。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
data = pd.read_csv("digit recognizor.csv")
X = data.iloc[:,1:]
y = data.iloc[:,0]
X.shape # (42000,784)
可視化一部分樣本(40個)
def plot(mnist):
fig, axes = plt.subplots(4,10,figsize=(10,4),subplot_kw={'xticks':[],'yticks':[]},
gridspec_kw=dict(hspace=0.1,wspace=0.1))
for i,ax in enumerate(axes.flat):
ax.imshow(mnist[i].reshape(28,28),cmap='binary')
plt.show()
X_mnixt_example = X[:40]
X_mnixt_example = np.array(X_mnixt_example, dtype='int32')# 整理成numpy格式數(shù)據(jù)
plot(X_mnixt_example)# 調(diào)用函數(shù)畫圖
接著用算法訓(xùn)練一遍原數(shù)據(jù)集纫骑,使用交叉驗證評價其表現(xiàn):
# Time using 1.5h
from sklearn.neighbors import KNeighborsClassifier as KNN
cross_val_score(KNN(5), X, y, cv=5, n_jobs=-1).mean() # 98.3%
雖然簡單但卻也是非常強大的機器學(xué)習(xí)算法蝎亚,不過由于其每次計算往往都要遍歷全部樣本,這樣當(dāng)數(shù)據(jù)特別多先馆,數(shù)據(jù)維度特別大時將非常消耗時間发框。對于
這樣的分類器,我們希望在提升模型表現(xiàn)和訓(xùn)練模型時間消耗上達到一個均衡。這也正是降維的意義之一梅惯。
可以看到算法在
折交叉驗證下在數(shù)據(jù)集上達到平均
的準確率宪拥。但是時間消耗為1.5小時,這是因為數(shù)具量實在太大铣减,當(dāng)然也和
這種算法有關(guān)她君。同樣的數(shù)據(jù)在隨機森林上只需
分鐘左右。不過這里為了展示PCA的強大之處葫哗,使用了
缔刹。
接下來用對數(shù)據(jù)進行降維,為了能有更好的降維效果劣针,首先繪制維度的學(xué)習(xí)曲線校镐,大致確定一個不至于使模型表現(xiàn)太壞的維度。由于數(shù)據(jù)有一定的穩(wěn)定性捺典,在
表現(xiàn)好的數(shù)據(jù)在
也極大可能會表現(xiàn)好鸟廓,為了效率先用
分類器作訓(xùn)練來繪制維度的學(xué)習(xí)曲線:
score = []
for i in range(1,101,10):
X_dr = PCA(i).fit_transform(X)
once = cross_val_score(RFC(n_estimators=10,random_state=0) ,X_dr,y,cv=5).mean()
score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,101,10),score)
plt.show()
可以發(fā)現(xiàn)維度在之后對準確率的提升已經(jīng)很小了。我們選取降維到
襟己。這里需要解釋的是引谜,在
上準確率僅在
上下,是因為我們沒有對
進行調(diào)參擎浴,如果增加其中決策樹的數(shù)量是可以看到準確率在
以上的员咽,另外,每種模型往往也都有自己更擅長的數(shù)據(jù)集退客,
也許對這種數(shù)據(jù)就不太擅長骏融。接下來再在
上看一下降維數(shù)據(jù)的表現(xiàn),由于數(shù)據(jù)已降維到
萌狂,相比之前運算量已大幅下降档玻,故使用
也是可以的:
# Time using 5min
X_dr = PCA(21).fit_transform(X)
X_dr.shape #(42000, 21)
cross_val_score(KNN(5), X_dr, y, cv=5, n_jobs=-1).mean()
可以看到雖然準確率不如使用全部數(shù)據(jù),但也達到了茫藏,原數(shù)據(jù)有
個維度误趴,而我們只使用了降維的
維度數(shù)據(jù)就有接近原數(shù)據(jù)的效果!這就是
的強大之處务傲。
3 PCA與SVD之間的關(guān)系
我們經(jīng)常聽到別人說的求解用到了
分解凉当,這是什么意思呢?首先我們來看二者之間的關(guān)系售葡。
在的求解中
變換矩陣是原特征矩陣的協(xié)方差矩陣
的正交特征向量按列拼成的矩陣看杭。而在
分解中
矩陣是
的正交特征向量按列組成的矩陣。
這下我們知道了挟伙,若楼雹,那么
分解中的正交矩陣
正是PCA中的正交矩陣
。這就是二者之間的數(shù)學(xué)關(guān)系。
而分解已經(jīng)有更快的數(shù)值解法了贮缅,不需要直接計算
的特征值和特征向量(對于大矩陣如果這樣計算將會有非常非常大的計算量)榨咐,
可以不計算協(xié)方差矩陣等復(fù)雜的計算過程,就直接求出新特征空間和降維后的特征矩陣谴供。所以
的求解通常都是用
分解得到
矩陣块茁。
例如在中,其封裝的
就是基于
求解的桂肌,而矩陣
和
雖然會被計算出來数焊,但完全不會被用到。
from sklearn.decomposition import PCA
pca_f = PCA(n_components=0.97,svd_solver="full")
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
pca_f.explained_variance_ratio_ #0.978
如上面一段代碼崎场,在位置輸入
之間的浮點數(shù)昌跌,并且讓參數(shù)
(該參數(shù)就是指定
的計算方式的),表示希望降維后的總解釋性方差占比大于
指定的百分比照雁,即是說,希望保留百分之多少的信息量答恶。
按照
分解過程會自動選出能夠讓保留的信息量超過我們指定百分比的特征數(shù)量饺蚊。
注:本文在解釋PCA原理部分的思路參考了知乎文章PCA的數(shù)學(xué)原理。
參考文獻:
.
張賢達. 矩陣分析與應(yīng)用(第二版). 北京:清華大學(xué)出版社悬嗓,2013.
.
PCA的數(shù)學(xué)原理. 知乎文章. 鄭申海:https://zhuanlan.zhihu.com/p/21580949污呼,2016.
.
Aurélien Géron. Hands-On Machine Learning with Scikit-Learn and TensorFlow. Dimensionality Reduction
轉(zhuǎn)載請注明出處十办,謝謝合作赃春!