機器學(xué)習(xí)數(shù)學(xué)基礎(chǔ):從奇異值分解 SVD 看 PCA 的主成分

今天我們來看一個在數(shù)據(jù)分析和機器學(xué)習(xí)領(lǐng)域中常用的降維方法,即主成分分析(PCA)。它是探索性數(shù)據(jù)分析(EDA)和機器學(xué)習(xí)算法對數(shù)據(jù)的基本處理方法。
1引言
首先,我們來看一下機器學(xué)習(xí)中數(shù)據(jù)的表示形式。如下圖所示,一般用一個矩陣

為什么要對
嫌 長得太胖穿得太多,一下看不清。讓它減減肥,好觀察啊。
用行話說就是,特征太多,讓人迷失,需要精簡,才能在屏幕上展現(xiàn)數(shù)據(jù)的整體樣貌。
嫌 長得沒啥特點,沒有棱角,總之看了沒留下啥印象。
用行話可以說是,特征不典型,特征之間線性相關(guān),不利于對數(shù)據(jù)的后續(xù)處理和分析。
總之,嫌數(shù)據(jù)矩陣
2主成分分析
今天主要看的 PCA 方法就是試圖在原始高維數(shù)據(jù)矩陣中找到特征的線性組合以構(gòu)造更具代表性的數(shù)據(jù)特征表示形式,在降維的同時讓數(shù)據(jù)更有精氣神。
降維問題本身可以看作最優(yōu)化問題,但本篇主要是從奇異值分解的角度來解讀 PCA,因此對于降維問題的描述不作詳細(xì)展開。簡而言之,PCA 降維的目標(biāo)為,
一方面為了減少數(shù)據(jù)的特征數(shù),因此要挑選出最具代表性的一些特征。
保持特征的可分性,即在原來空間中有明顯差異的數(shù)據(jù)在降維后也希望盡量保持差異。換句話說,保持?jǐn)?shù)據(jù)間的線性結(jié)構(gòu),比如在原始空間中離得遠(yuǎn)的數(shù)據(jù)在降維后也希望離得遠(yuǎn),近的自然也一樣。

我們結(jié)合一個簡單例子來闡述一下 PCA。如上圖所示,給你一百個數(shù)據(jù),每個數(shù)據(jù)只用兩個特征(比如身高和體重),這里為了可視化,分別將它們看成
PCA 的目的之一是從這些數(shù)據(jù)自身出發(fā),找出新的相互正交的坐標(biāo)軸(將它們看成新的特征),希望這些特征之間不線性相關(guān)。這些正交軸也稱為數(shù)據(jù)特征空間中的主成分(PC),最后將數(shù)據(jù)點投影到這些 PC 上得到新的坐標(biāo)表示。
我們假設(shè)只用一個特征來刻畫上面這批數(shù)據(jù),也就是說只需要找出一個坐標(biāo)軸,即一個 PC。這些數(shù)據(jù)坐標(biāo)往這個 PC 投影得到新的坐標(biāo),而且每個數(shù)據(jù)只有一個坐標(biāo)了。那么你怎么選這個 PC 呢?
為了讓新坐標(biāo)盡量能夠區(qū)分開不同的數(shù)據(jù),我們希望沿著這個 PC 能捕獲到數(shù)據(jù)中最大的差異??聪旅娴膭訄D,我們假設(shè) PC 經(jīng)過數(shù)據(jù)集的中心點,然后這些數(shù)據(jù)點往不同的 PC 上投影,最終都投到一條直線上,那么哪條線將這些數(shù)據(jù)分開得最好呢?

相信大家能感覺出哪個方向好。但是問題來了,怎么用數(shù)學(xué)公式來量化不同方向的好差呢?
對了,可以用方差。再加上如果考慮多個 PC 之間的相關(guān)性的話,那就是協(xié)方差矩陣。
.協(xié)方差矩陣
在機器學(xué)習(xí)中,計算兩個特征
式中
而由兩個特征
如果有多個特征,記為
協(xié)方差矩陣衡量的是數(shù)據(jù)的不同坐標(biāo)分量兩兩之間一起變化的程度。如果它是一個對角矩陣,說明特征之間沒有線性相關(guān)性,這也是 PCA 所追求的目標(biāo)之一。
簡化形式
如果將這些特征
接下來我們用兩種方法來得到 PC。
.特征分解
由于協(xié)方差矩陣是一個半正定對稱矩陣,因此我們可以對它作特征分解,
可以看到,協(xié)方差矩陣被分解為由特征向量按列組成的矩陣
這里需要注意的是,這些特征向量和特征值不是隨便排列的,例如,特征值在
然后,我們可以將數(shù)據(jù)投影到這些 PC 上去,即
新特征的協(xié)方差矩陣是對角矩陣,而且,對角線上的方差是從大到小排列的,這重要嗎?是的,不要忘了,我們還要降維,因此將數(shù)據(jù)點投影到前
而且,這些保留的前
.奇異值分解
我們也可以用奇異值分解來計算 PC,但不是分解協(xié)方差矩陣,而是分解特征矩陣。
先對
然后代入?yún)f(xié)方差矩陣,
現(xiàn)在的 PC 是矩陣
跟上面特征分解的協(xié)方差矩陣比較可得,
但這里好像沒有用到它們啊。其實不然,一般來說,大佬是在幕后操作的,這里處在 C 位的奇異值或者特征值們也一樣。
要知道,我們最后得到的 PC 都是按大佬們的大小來排座位的。
.換個角度
除了從方差角度考慮外,也可以從數(shù)據(jù)點到 PC 軸的垂直距離來考慮問題。
你可以想象下圖中的黑線是實心桿,而每條紅線表示彈簧。彈簧的能量與它的長度平方成正比(物理學(xué)上稱為胡克定律),因此,如果所有彈簧長度平方之和達(dá)到最小時,桿子將處于平衡狀態(tài)。下圖模擬了達(dá)到平衡狀態(tài)的過程,

這里其實想說的是,PCA 方法可以從多個角度去理解,那么對應(yīng)的數(shù)學(xué)問題也會有所不同,但這個不是本篇的重點。
3降維實戰(zhàn)
import?numpy?as?np
import?seaborn?as?sns
.小型數(shù)據(jù)集
iris?=?sns.load_dataset('iris')
先看一眼數(shù)據(jù),顯示前五行。
iris.head()
| sepal_length | sepal_width | petal_length | petal_width | species | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
Iris 鳶尾花數(shù)據(jù)集是一個經(jīng)典數(shù)據(jù)集。
數(shù)據(jù)集內(nèi)包含 3 類共 150 條記錄,每類各 50 個數(shù)據(jù),每條記錄都有 4 項特征:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這 4 個特征預(yù)測鳶尾花卉的品種。上面五列對應(yīng)的特征說明,
sepal_length花萼長度sepal_width花萼寬度petal_length花瓣長度petal_width花瓣寬度species品種(共 setosa, versicolour, virginica 三類)
.特征矩陣
我們把最后一列去掉,只取前四列,可以拿來預(yù)測最后一列。因此,特征矩陣定義如下,
X?=?iris.values[:,:-1]
X?=?X.astype(np.float64)
#?查看前五行數(shù)據(jù)
X[0:5]
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2]])
#?1、對特征矩陣零中心化
X?-=?np.mean(X,?axis=0)
看一下協(xié)方差矩陣
cov_XTX?=?X.T@X
cov_XTX
array([[102.16833333, -6.32266667, 189.873 , 76.92433333],
[ -6.32266667, 28.30693333, -49.1188 , -18.12426667],
[189.873 , -49.1188 , 464.3254 , 193.0458 ],
[ 76.92433333, -18.12426667, 193.0458 , 86.56993333]])
.降維
#?2、對特征矩陣進(jìn)行?SVD?分解
U,?Sigma,?VT?=?np.linalg.svd(X,?full_matrices=False)
U.shape,?Sigma.shape,?VT.shape
((150, 4), (4,), (4, 4))
由于上面我們設(shè)置參數(shù) full_matrices=False,所以得到的矩陣
我們來構(gòu)造新的特征,但要注意,上面函數(shù) np.linalg.svd 返回的矩陣 VT 是指
[email protected]
再看一下這個新特征矩陣的協(xié)方差矩陣
cov_YTY?=?Y.T@Y
cov_YTY
array([[ 6.30008014e+02, -8.12751455e-14, -1.46101800e-14,
-6.74844752e-14],
[-8.12751455e-14, 3.61579414e+01, -8.02807470e-15,
9.98660131e-15],
[-1.46101800e-14, -8.02807470e-15, 1.16532155e+01,
-8.45168460e-16],
[-6.74844752e-14, 9.98660131e-15, -8.45168460e-16,
3.55142885e+00]])
非對角線上的協(xié)方差都是極小了吧,當(dāng)零看,因此是個對角矩陣。
4左奇異向量
從前文中,大家已經(jīng)看到了 PCA 和 SVD 之間的聯(lián)系了。最后,我們來試圖對最終得到的 PC 從奇異值分解的角度作進(jìn)一步的解讀。
我們知道,新的特征矩陣可以這么計算,
如果最終只想要
這就是將
我們只知道現(xiàn)在確實已經(jīng)去除了新特征之間的線性相關(guān)性(協(xié)方差為零)。但是,得到的新坐標(biāo)
另外,這里好像沒有左奇異向量什么事情呀。甚至連處在 C 位的矩陣之芯也沒有直接出場,只用到右奇異向量。這貌似總感覺不舒服,難道辛辛苦苦分解出仨,你就用了邊上一個就完事了?
我們回到奇異值分解,
發(fā)現(xiàn)了吧,這就是新坐標(biāo)
好了,這樣來看的話,正是處在 C 位的矩陣之芯和左奇異向量聯(lián)手打造出了新的特征。
這樣子是不是可以更好地理解新生成的特征呢?我們不妨用前一篇中的理論來試著解讀一番。
.畫龍點睛
那就是特征矩陣
而
如果要降維到
特征變換
如何從數(shù)據(jù)的特征矩陣
由
可知,其中 是對原來的特征矩陣的列(特征)進(jìn)行線性組合,再用 的對角元素分別縮放,構(gòu)造出了最終的新特征。 如果把特征矩陣
看成線性變換,那就是,
5小結(jié)
矩陣
矩陣作為變換的化身,往往是以
這樣的形式發(fā)揮作用。給人感覺矩陣以這種身份出現(xiàn)的情況更多? 矩陣僅僅表示數(shù)據(jù),并不是用來變換別人。這種場景也不少,比如本篇里的例子,它是以列向量集合的形式出現(xiàn)。
但不管它是什么身份,都可以對矩陣作奇異值分解,而且分解以后可以得到更好的解讀,不管是變換也好,還是數(shù)據(jù)表示也好。
機器學(xué)習(xí)從 入 門 到 精 通 路 線 圖
阿里云Python訓(xùn)練營總結(jié):聊聊堅持的意義

