【數(shù)學(xué)筆記】PCA數(shù)據(jù)降維
點(diǎn)擊藍(lán)字 關(guān)注我們
最近幾天開始看華為杯的論文,第一篇關(guān)于無線智能傳播的模型就有太多的東西看不懂,其中涉及到很多有關(guān)數(shù)據(jù)特征工程的一些算法,為此我查閱了不少的資料,一點(diǎn)點(diǎn)搞吧,權(quán)當(dāng)做個記錄。
PCA即主成分分析,是用一個超平面對所有樣本進(jìn)行恰當(dāng)表達(dá)的方法,思想是將n維特征映射到k維上(k
這k維特征稱為主成分,是重新構(gòu)造出來的k維特征,而不是簡單地從n維特征中去除其余n-k維特征。由于它具有降維去噪的強(qiáng)大作用,通常在數(shù)據(jù)挖掘中起到很重要的作用。
PCA基本數(shù)學(xué)原理
數(shù)據(jù)的向量表示及降維問題
下面先來看一個高中就學(xué)過的向量運(yùn)算:內(nèi)積。兩個維數(shù)相同的向量的內(nèi)積被定義為:

內(nèi)積運(yùn)算將兩個向量映射為一個實(shí)數(shù)。
下面我們分析內(nèi)積的幾何意義。
假設(shè)A和B是兩個n維向量,我們知道n維向量可以等價表示為n維空間中的一條從原點(diǎn)發(fā)射的有向線段。

我們將內(nèi)積表示為另一種我們熟悉的形式:

假設(shè)B的模為1

設(shè)向量B的模為1,則A與B的內(nèi)積值等于A向B所在直線投影的矢量長度!
基
向量(x,y)實(shí)際上表示線性組合:

此處(1,0)和(0,1)叫做二維空間中的一組基。

所以,要準(zhǔn)確描述向量,首先要確定一組基,然后給出在基所在的各個直線上的投影值,就可以了。
我們之所以默認(rèn)選擇(1,0)和(0,1)為基,當(dāng)然是比較方便,因?yàn)樗鼈兎謩e是x和y軸正方向上的單位向量,因此就使得二維平面上點(diǎn)坐標(biāo)和向量一一對應(yīng),非常方便。但實(shí)際上任何兩個線性無關(guān)的二維向量都可以成為一組基,所謂線性無關(guān)在二維平面內(nèi)可以直觀認(rèn)為是兩個不在一條直線上的向量。
現(xiàn)在,我們想獲得(3,2)在新基上的坐標(biāo),即在兩個方向上的投影矢量值,那么根據(jù)內(nèi)積的幾何意義,我們只要分別計算(3,2)和兩個基的內(nèi)積,不難得到新的坐標(biāo)為

下圖給出了新的基以及(3,2)在新基上坐標(biāo)值的示意圖:

基變換的矩陣表示
下面我們找一種簡便的方式來表示基變換。

例如(1,1),(2,2),(3,3),想變換到剛才那組基上,則可以這樣表示:

一般的,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那么首先將R個基按行組成矩陣A,然后將向量按列組成矩陣B,那么兩矩陣的乘積AB就是變換結(jié)果,其中AB的第m列為A中第m列變換后的結(jié)果。

協(xié)方差矩陣及優(yōu)化目標(biāo)
上面我們討論了選擇不同的基可以對同樣一組數(shù)據(jù)給出不同的表示,而且如果基的數(shù)量少于向量本身的維數(shù),則可以達(dá)到降維的效果。但是我們還沒有回答一個最最關(guān)鍵的問題:如何選擇基才是最優(yōu)的?;蛘哒f,如果我們有一組N維向量,現(xiàn)在要將其降到K維(K小于N),那么我們應(yīng)該如何選擇K個基才能最大程度保留原有的信息?
我們以一個具體的例子展開。
假設(shè)我們的數(shù)據(jù)由五條記錄組成,將它們表示成矩陣形式:

為了后續(xù)處理方便,我們首先將每個字段內(nèi)所有值都減去字段均值,其結(jié)果是將每個字段都變?yōu)榫禐?(這樣做的道理和好處后面會看到)。

五條數(shù)據(jù)在平面直角坐標(biāo)系內(nèi)的樣子:

現(xiàn)在問題來了:如果我們必須使用一維來表示這些數(shù)據(jù),又希望盡量保留原始的信息,你要如何選擇?
通過以上對基變換的討論我們知道,這個問題實(shí)際上是要在二維平面中選擇一個方向,將所有數(shù)據(jù)都投影到這個方向所在直線上,用投影值表示原始記錄。這是一個實(shí)際的二維降到一維的問題。
那么如何選擇這個方向(或者說基)才能盡量保留最多的原始信息呢?一種直觀的看法是:希望投影后的投影值盡可能分散。
數(shù)學(xué)方法描述
方差
我們希望投影后投影值盡可能分散,而這種分散程度,可以用數(shù)學(xué)上的方差來表述。此處,一個字段的方差可以看做是每個元素與字段均值的差的平方和的均值,即:

由于上面我們已經(jīng)將每個字段的均值都化為0了,因此方差可以直接用每個元素的平方和除以元素個數(shù)表示:

協(xié)方差
對于上面二維降成一維的問題來說,找到那個使得方差最大的方向就可以了。不過對于更高維,還有一個問題需要解決??紤]三維降到二維問題。與之前相同,首先我們希望找到一個方向使得投影后方差最大,這樣就完成了第一個方向的選擇,繼而我們選擇第二個投影方向。
如果我們還是單純只選擇方差最大的方向,很明顯,這個方向與第一個方向應(yīng)該是“幾乎重合在一起”,顯然這樣的維度是沒有用的,因此,應(yīng)該有其他約束條件。從直觀上說,讓兩個字段盡可能表示更多的原始信息,我們是不希望它們之間存在(線性)相關(guān)性的,因?yàn)橄嚓P(guān)性意味著兩個字段不是完全獨(dú)立,必然存在重復(fù)表示的信息。
數(shù)學(xué)上可以用兩個字段的協(xié)方差表示其相關(guān)性,由于已經(jīng)讓每個字段均值為0,則:

當(dāng)協(xié)方差為0時,表示兩個字段完全獨(dú)立。為了讓協(xié)方差為0,我們選擇第二個基時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。
至此,我們得到了降維問題的優(yōu)化目標(biāo):將一組N維向量降為K維(K大于0,小于N),其目標(biāo)是選擇K個單位(模為1)正交基,使得原始數(shù)據(jù)變換到這組基上后,各字段兩兩間協(xié)方差為0,而字段的方差則盡可能大(在正交的約束下,取最大的K個方差)。
協(xié)方差矩陣
我們看到,最終要達(dá)到的目的與字段內(nèi)方差及字段間協(xié)方差有密切關(guān)系。因此我們希望能將兩者統(tǒng)一表示,仔細(xì)觀察發(fā)現(xiàn),兩者均可以表示為內(nèi)積的形式,而內(nèi)積又與矩陣相乘密切相關(guān)。
假設(shè)我們只有a和b兩個字段,那么我們將它們按行組成矩陣X:

然后我們用X乘以X的轉(zhuǎn)置,并乘上系數(shù)1/m:

奇跡出現(xiàn)了!這個矩陣對角線上的兩個元素分別是兩個字段的方差,而其它元素是a和b的協(xié)方差。兩者被統(tǒng)一到了一個矩陣的。
協(xié)方差矩陣對角化
根據(jù)上述推導(dǎo),我們發(fā)現(xiàn)要達(dá)到優(yōu)化目前,等價于將協(xié)方差矩陣對角化:即除對角線外的其它元素化為0,并且在對角線上將元素按大小從上到下排列,這樣我們就達(dá)到了優(yōu)化目的。
設(shè)原始數(shù)據(jù)矩陣X對應(yīng)的協(xié)方差矩陣為C,而P是一組基按行組成的矩陣,設(shè)Y=PX,則Y為X對P做基變換后的數(shù)據(jù)。設(shè)Y的協(xié)方差矩陣為D,我們推導(dǎo)一下D與C的關(guān)系:

我們要找的P不是別的,而是能讓原始協(xié)方差矩陣對角化的P。換句話說,優(yōu)化目標(biāo)變成了尋找一個矩陣P,滿足
一個n行n列的實(shí)對稱矩陣一定可以找到n個單位正交特征向量,

則對協(xié)方差矩陣C有如下結(jié)論:

我們發(fā)現(xiàn)我們已經(jīng)找到了需要的矩陣P:

總結(jié)一下PCA的算法步驟:

sklearn中PCA注釋
與上述推導(dǎo)不同,在sklearn中,通過SVD計算協(xié)方差矩陣的特征值與特征向量。
導(dǎo)入:
from sklearn.decomposition import PCAPCA代碼參數(shù):
PCA( n_components=None, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None,)
我也不全明白,主要對幾個常用的參數(shù)做一個注解:
n_components:接受參數(shù)類型為int, float or ‘mle’,
PCA算法中所要保留的主成分個數(shù),也即保留下來的特征個數(shù),
如果 n_components = 1,將把原始數(shù)據(jù)降到一維;
如果賦值為string,如n_components=‘mle’,將自動選取特征個數(shù),使得滿足所要求的方差百分比;
如果沒有賦值,默認(rèn)為None,特征個數(shù)不會改變(特征數(shù)據(jù)本身會改變)
whiten:數(shù)據(jù)在經(jīng)過 PCA 白化以后,其協(xié)方差矩陣是一個單位矩陣,即各維度變得不相關(guān),且每個維度方差都是 1。默認(rèn)為False
屬性:
explained_variance_ratio_:返回所保留各個特征的方差百分比,如果n_components沒有賦值,則所有特征都會返回一個數(shù)值且解釋方差之和等于1
n_components_:返回所保留的特征個數(shù)
方法:
fit(X):用數(shù)據(jù)X來訓(xùn)練PCA模型
fit_transform(X):用X來訓(xùn)練PCA模型,同時返回降維后的數(shù)據(jù)
newX=pca.fit_transform(X),newX就是降維后的數(shù)據(jù)。
inverse_transform(X):將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù),X=pca.inverse_transform(newX)?
transform(X):將數(shù)據(jù)X轉(zhuǎn)換成降維后的數(shù)據(jù)。當(dāng)模型訓(xùn)練好后,對于新輸入的數(shù)據(jù),都可以用transform方法來降維。
使用sklearn實(shí)現(xiàn)PCA降維
> import numpy as np> from sklearn.decomposition import PCA> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])> pca = PCA(n_components=2)> pca.fit(X)PCA(n_components=2)> print(pca.explained_variance_ratio_)[0.9924... 0.0075...]
參考來源:
http://blog.codinglabs.org/articles/pca-tutorial.html
https://blog.csdn.net/program_developer/article/details/80632779
https://blog.csdn.net/happyxghero/article/details/92846614
https://blog.csdn.net/kobeyu652453/article/details/107058229?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161287299616780261913125%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161287299616780261913125&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-5-107058229.pc_search_result_cache&utm_term=sklearn+%25E4%25B8%25ADPCA%25E6%25BA%2590%25E7%25A0%2581%25E5%2588%2586%25E6%259E%2590
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html?highlight=pca#sklearn.decomposition.PCA

深度學(xué)習(xí)入門筆記
微信號:sdxx_rmbj
日常更新學(xué)習(xí)筆記、論文簡述
