【菜菜的sklearn】04 降維算法PCA和SVD

小伙伴們大家好~o( ̄▽?zhuān)?/em>)ブ
我是菜菜,這里是我的sklearn課堂第4期:降維算法PCA和SVD~

我的開(kāi)發(fā)環(huán)境是Jupyter lab,所用的庫(kù)和版本大家參考:
Python 3.7.1(你的版本至少要3.4以上
Scikit-learn 0.20.0 (你的版本至少要0.19
Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1.0

本文主要內(nèi)容:
?1 概述
??1.1 從什么叫“維度”說(shuō)開(kāi)來(lái)
??1.2 sklearn中的降維算法
?2 PCA與SVD
??2.1 降維究竟是怎樣實(shí)現(xiàn)?
??2.2 重要參數(shù)n_components
???2.2.1 迷你案例:高維數(shù)據(jù)的可視化
???2.2.2 最大似然估計(jì)自選超參數(shù)
???2.2.3 按信息量占比選超參數(shù)
??2.3 PCA中的SVD
???2.3.1 PCA中的SVD哪里來(lái)咳秉?

1 概述

1.1 從什么叫“維度”說(shuō)開(kāi)來(lái)

在過(guò)去的三周里爽蝴,我們已經(jīng)帶大家認(rèn)識(shí)了兩個(gè)算法和數(shù)據(jù)預(yù)處理過(guò)程。期間牵署,我們不斷提到一些語(yǔ)言,比如說(shuō):隨機(jī)森林是通過(guò)隨機(jī)抽取特征來(lái)建樹(shù)喧半,以避免高維計(jì)算奴迅;再比如說(shuō),sklearn中導(dǎo)入特征矩陣,必須是至少二維取具;上周我們講解特征工程脖隶,還特地提到了,特征選擇的目的是通過(guò)降維來(lái)降低算法的計(jì)算成本……這些語(yǔ)言都很正常地被我用來(lái)使用暇检,直到有一天产阱,一個(gè)小伙伴問(wèn)了我,”維度“到底是什么块仆?

對(duì)于數(shù)組和Series來(lái)說(shuō)构蹬,維度就是功能shape返回的結(jié)果,shape中返回了幾個(gè)數(shù)字悔据,就是幾維庄敛。索引以外的數(shù)據(jù),不分行列的叫一維(此時(shí)shape返回唯一的維度上的數(shù)據(jù)個(gè)數(shù))科汗,有行列之分叫二維(shape返回行x列)藻烤,也稱(chēng)為表。一張表最多二維头滔,復(fù)數(shù)的表構(gòu)成了更高的維度怖亭。當(dāng)一個(gè)數(shù)組中存在2張3行4列的表時(shí),shape返回的是(更高維坤检,行兴猩,列)。當(dāng)數(shù)組中存在2組2張3行4列的表時(shí)早歇,數(shù)據(jù)就是4維峭跳,shape返回(2,2,3,4)。

數(shù)組中的每一張表缺前,都可以是一個(gè)特征矩陣或一個(gè)DataFrame蛀醉,這些結(jié)構(gòu)永遠(yuǎn)只有一張表,所以一定有行列衅码,其中行是樣本拯刁,列是特征。針對(duì)每一張表逝段,維度指的是樣本的數(shù)量或特征的數(shù)量垛玻,一般無(wú)特別說(shuō)明,指的都是特征的數(shù)量奶躯。除了索引之外帚桩,一個(gè)特征是一維,兩個(gè)特征是二維嘹黔,n個(gè)特征是n維账嚎。

對(duì)圖像來(lái)說(shuō),維度就是圖像中特征向量的數(shù)量。特征向量可以理解為是坐標(biāo)軸郭蕉,一個(gè)特征向量定義一條直線疼邀,是一維,兩個(gè)相互垂直的特征向量定義一個(gè)平面召锈,即一個(gè)直角坐標(biāo)系旁振,就是二維,三個(gè)相互垂直的特征向量定義一個(gè)空間涨岁,即一個(gè)立體直角坐標(biāo)系拐袜,就是三維。三個(gè)以上的特征向量相互垂直梢薪,定義人眼無(wú)法看見(jiàn)蹬铺,也無(wú)法想象的高維空間。

降維算法中的”降維“沮尿,指的是降低特征矩陣中特征的數(shù)量丛塌。上周的課中我們說(shuō)過(guò)较解,降維的目的是為了讓算法運(yùn)算更快畜疾,效果更好,但其實(shí)還有另一種需求:數(shù)據(jù)可視化印衔。從上面的圖我們其實(shí)可以看得出啡捶,圖像和特征矩陣的維度是可以相互對(duì)應(yīng)的,即一個(gè)特征對(duì)應(yīng)一個(gè)特征向量奸焙,對(duì)應(yīng)一條坐標(biāo)軸瞎暑。所以,三維及以下的特征矩陣与帆,是可以被可視化的了赌,這可以幫助我們很快地理解數(shù)據(jù)的分布,而三維以上特征矩陣的則不能被可視化玄糟,數(shù)據(jù)的性質(zhì)也就比較難理解勿她。

1.2 sklearn中的降維算法

sklearn中降維算法都被包括在模塊decomposition中,這個(gè)模塊本質(zhì)是一個(gè)矩陣分解模塊阵翎。在過(guò)去的十年中逢并,如果要討論算法進(jìn)步的先鋒,矩陣分解可以說(shuō)是獨(dú)樹(shù)一幟郭卫。矩陣分解可以用在降維砍聊,深度學(xué)習(xí),聚類(lèi)分析贰军,數(shù)據(jù)預(yù)處理玻蝌,低緯度特征學(xué)習(xí),推薦系統(tǒng),大數(shù)據(jù)分析等領(lǐng)域灶伊。在2006年疆前,Netflix曾經(jīng)舉辦了一個(gè)獎(jiǎng)金為100萬(wàn)美元的推薦系統(tǒng)算法比賽,最后的獲獎(jiǎng)?wù)呔褪褂昧司仃嚪纸庵械拿餍牵浩娈愔捣纸釹VD聘萨。(~o ̄3 ̄)~菊安醬會(huì)講SVD在推薦系統(tǒng)中的應(yīng)用竹椒,大家不要錯(cuò)過(guò)!

SVD和主成分分析PCA都屬于矩陣分解算法中的入門(mén)算法米辐,都是通過(guò)分解特征矩陣來(lái)進(jìn)行降維胸完,它們也是我們今天要講解的重點(diǎn)。雖然是入門(mén)算法翘贮,卻不代表PCA和SVD簡(jiǎn)單:下面兩張圖是我在一篇SVD的論文中隨意截取的兩頁(yè)赊窥,可以看到滿滿的數(shù)學(xué)公式(基本是線性代數(shù))。要想在短短的一個(gè)小時(shí)內(nèi)狸页,給大家講明白這些公式锨能,我講完不吐血大家聽(tīng)完也吐血了。所以今天芍耘,我會(huì)用最簡(jiǎn)單的方式為大家呈現(xiàn)降維算法的原理址遇,但這注定意味著大家無(wú)法看到這個(gè)算法的全貌,在機(jī)器學(xué)習(xí)中逃避數(shù)學(xué)是邪道斋竞,所以更多原理大家自己去閱讀倔约。

2 PCA與SVD

在降維過(guò)程中,我們會(huì)減少特征的數(shù)量坝初,這意味著刪除數(shù)據(jù)浸剩,數(shù)據(jù)量變少則表示模型可以獲取的信息會(huì)變少,模型的表現(xiàn)可能會(huì)因此受影響鳄袍。同時(shí)绢要,在高維數(shù)據(jù)中,必然有一些特征是不帶有有效的信息的(比如噪音)拗小,或者有一些特征帶有的信息和其他一些特征是重復(fù)的(比如一些特征可能會(huì)線性相關(guān))重罪。我們希望能夠找出一種辦法來(lái)幫助我們衡量特征上所帶的信息量,讓我們?cè)诮稻S的過(guò)程中十籍,能夠即減少特征的數(shù)量蛆封,又保留大部分有效信息——將那些帶有重復(fù)信息的特征合并,并刪除那些帶無(wú)效信息的特征等等——逐漸創(chuàng)造出能夠代表原特征矩陣大部分信息的勾栗,特征更少的惨篱,新特征矩陣。

上周的特征工程課中围俘,我們提到過(guò)一種重要的特征選擇方法:方差過(guò)濾砸讳。如果一個(gè)特征的方差很小琢融,則意味著這個(gè)特征上很可能有大量取值都相同(比如90%都是1簿寂,只有10%是0常遂,甚至100%是1),那這一個(gè)特征的取值對(duì)樣本而言就沒(méi)有區(qū)分度平绩,這種特征就不帶有有效信息漠另。從方差的這種應(yīng)用就可以推斷出,如果一個(gè)特征的方差很大性湿,則說(shuō)明這個(gè)特征上帶有大量的信息肤频。因此葫录,在降維中领猾,PCA使用的信息量衡量指標(biāo)摔竿,就是樣本方差,又稱(chēng)可解釋性方差继低,方差越大袁翁,特征所帶的信息量越多
Var = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \hat{x})^2
Var代表一個(gè)特征的方差柄驻,n代表樣本量焙压,xi代表一個(gè)特征中的每個(gè)樣本取值抑钟,xhat代表這一列樣本的均值在塔。

面試高危問(wèn)題
方差計(jì)算公式中為什么除數(shù)是n-1?
這是為了得到樣本方差的無(wú)偏估計(jì)拨黔,更多大家可以自己去探索~

2.1 降維究竟是怎樣實(shí)現(xiàn)?

class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

PCA作為矩陣分解算法的核心算法城榛,其實(shí)沒(méi)有太多參數(shù)态兴,但不幸的是每個(gè)參數(shù)的意義和運(yùn)用都很難,因?yàn)閹缀趺總€(gè)參數(shù)都涉及到高深的數(shù)學(xué)原理喘垂。為了參數(shù)的運(yùn)用和意義變得明朗绍撞,我們來(lái)看一組簡(jiǎn)單的二維數(shù)據(jù)的降維傻铣。

我們現(xiàn)在有一組簡(jiǎn)單的數(shù)據(jù),有特征x1和x2鸭限,三個(gè)樣本數(shù)據(jù)的坐標(biāo)點(diǎn)分別為(1,1)两踏,(2,2),(3,3)赡麦。我們可以讓x1和x2分別作為兩個(gè)特征向量帕识,很輕松地用一個(gè)二維平面來(lái)描述這組數(shù)據(jù)。這組數(shù)據(jù)現(xiàn)在每個(gè)特征的均值都為2晶姊,方差則等于:
x1\_var = x2\_var = \frac{(1-2)^2 + (2-2)^2 + (3-2)^2}{2} = 1
每個(gè)特征的數(shù)據(jù)一模一樣族吻,因此方差也都為1,數(shù)據(jù)的方差總和是2砍艾。

現(xiàn)在我們的目標(biāo)是:只用一個(gè)特征向量來(lái)描述這組數(shù)據(jù),即將二維數(shù)據(jù)降為一維數(shù)據(jù)凝垛,并且盡可能地保留信息量蜓谋,即讓數(shù)據(jù)的總方差盡量靠近2桃焕。于是,我們將原本的直角坐標(biāo)系逆時(shí)針旋轉(zhuǎn)45°让网,形成了新的特征向量x1*和x2*組成的新平面师痕,在這個(gè)新平面中,三個(gè)樣本數(shù)據(jù)的坐標(biāo)點(diǎn)可以表示為(\sqrt{2},0)胰坟,(2\sqrt{2},0)笔横,(3\sqrt{2},0)竞滓∷浣纾可以注意到涛菠,x2*上的數(shù)值此時(shí)都變成了0撇吞,因此x2*明顯不帶有任何有效信息了(此時(shí)x2*的方差也為0了)。此時(shí)迄薄,x1特征上的數(shù)據(jù)均值是2\sqrt{2}讥蔽,而方差則可表示成:
x2^*\_var = \frac{(\sqrt{2} - 2\sqrt{2})^2+(2\sqrt{2} - 2\sqrt{2})^2+(3\sqrt{2} - 2\sqrt{2})^2}{2} = 2
x1
上的數(shù)據(jù)均值為0涣易,方差也為0新症。

此時(shí)响禽,我們根據(jù)信息含量的排序芋类,取信息含量最大的一個(gè)特征,因?yàn)槲覀兿胍氖且痪S數(shù)據(jù)侯繁。所以我們可以將x2*刪除贮竟,同時(shí)也刪除圖中的x2*特征向量坝锰,剩下的x1*就代表了曾經(jīng)需要兩個(gè)特征來(lái)代表的三個(gè)樣本點(diǎn)。通過(guò)旋轉(zhuǎn)原有特征向量組成的坐標(biāo)軸來(lái)找到新特征向量和新坐標(biāo)平面顷级,我們將三個(gè)樣本點(diǎn)的信息壓縮到了一條直線上帽芽,實(shí)現(xiàn)了二維變一維翔冀,并且盡量保留原始數(shù)據(jù)的信息纤子。一個(gè)成功的降維控硼,就實(shí)現(xiàn)了。

不難注意到翼悴,在這個(gè)降維過(guò)程中鹦赎,有幾個(gè)重要的步驟:

過(guò)程 二維特征矩陣 n維特征矩陣
1 輸入原數(shù)據(jù)古话,結(jié)構(gòu)為 (3,2)
找出原本的2個(gè)特征對(duì)應(yīng)的直角坐標(biāo)系煞额,本質(zhì)是找出這2個(gè)特征構(gòu)成的2維平面
輸入原數(shù)據(jù)胀莹,結(jié)構(gòu)為 (m,n)
找出原本的n個(gè)特征向量構(gòu)成的n維空間V
2 決定降維后的特征數(shù)量:1 決定降維后的特征數(shù)量:k
3 旋轉(zhuǎn),找出一個(gè)新坐標(biāo)系
本質(zhì)是找出2個(gè)新的特征向量,以及它們構(gòu)成的新2維平面
新特征向量讓數(shù)據(jù)能夠被壓縮到少數(shù)特征上步绸,并且總信息量不損失太多
通過(guò)某種變化,找出n個(gè)新的特征向量刑桑,以及它們構(gòu)成的新n維空間V
4 找出數(shù)據(jù)點(diǎn)在新坐標(biāo)系上,2個(gè)新坐標(biāo)軸上的坐標(biāo) 找出原始數(shù)據(jù)在新特征空間V中的n個(gè)新特征向量上對(duì)應(yīng)的值琢锋,即“將數(shù)據(jù)映射到新空間中”
5 選取第1個(gè)方差最大的特征向量填抬,刪掉沒(méi)有被選中的特征飒责,成功將2維平面降為1維 選取前k個(gè)信息量最大的特征遣臼,刪掉沒(méi)有被選中的特征揍堰,成功將n維空間V降為k維

在步驟3當(dāng)中,我們用來(lái)找出n個(gè)新特征向量蝙眶,讓數(shù)據(jù)能夠被壓縮到少數(shù)特征上并且總信息量不損失太多的技術(shù)就是矩陣分解博敬。PCA和SVD是兩種不同的降維算法尾菇,但他們都遵從上面的過(guò)程來(lái)實(shí)現(xiàn)降維,只是兩種算法中矩陣分解的方法不同默赂,信息量的衡量指標(biāo)不同罷了。PCA使用方差作為信息量的衡量指標(biāo)奈辰,并且特征值分解來(lái)找出空間V。降維時(shí)论泛,它會(huì)通過(guò)一系列數(shù)學(xué)的神秘操作(比如說(shuō),產(chǎn)生協(xié)方差矩陣\frac{1}{n}XX^{T})將特征矩陣X分解為以下三個(gè)矩陣,其中QQ^{-1}是輔助的矩陣,Σ是一個(gè)對(duì)角矩陣(即除了對(duì)角線上有值,其他位置都是0的矩陣),其對(duì)角線上的元素就是方差。降維完成之后跌帐,PCA找到的每個(gè)新特征向量就叫做“主成分”,而被丟棄的特征向量被認(rèn)為信息量很少,這些信息很可能就是噪音。
X →數(shù)學(xué)神秘的宇宙→ Q\Sigma Q^{-1}
而SVD使用奇異值分解來(lái)找出空間V,其中Σ也是一個(gè)對(duì)角矩陣颈娜,不過(guò)它對(duì)角線上的元素是奇異值梆奈,這也是SVD中用來(lái)衡量特征上的信息量的指標(biāo)乓梨。U和V^{T}分別是左奇異矩陣和右奇異矩陣焰轻,也都是輔助矩陣蝠筑。
X →另一個(gè)數(shù)學(xué)神秘的宇宙→ U\Sigma V^{T}
在數(shù)學(xué)原理中已球,無(wú)論是PCA和SVD都需要遍歷所有的特征和樣本來(lái)計(jì)算信息量指標(biāo)忆某。并且在矩陣分解的過(guò)程之中,會(huì)產(chǎn)生比原來(lái)的特征矩陣更大的矩陣棒坏,比如原數(shù)據(jù)的結(jié)構(gòu)是(m,n),在矩陣分解中為了找出最佳新特征空間V喂窟,可能需要產(chǎn)生(n,n)碗啄,(m,m)大小的矩陣,還需要產(chǎn)生協(xié)方差矩陣去計(jì)算更多的信息。而現(xiàn)在無(wú)論是Python還是R筹裕,或者其他的任何語(yǔ)言,在大型矩陣運(yùn)算上都不是特別擅長(zhǎng)豪治,無(wú)論代碼如何簡(jiǎn)化,我們不可避免地要等待計(jì)算機(jī)去完成這個(gè)非常龐大的數(shù)學(xué)計(jì)算過(guò)程。因此,降維算法的計(jì)算量很大今布,運(yùn)行比較緩慢经备,但無(wú)論如何,它們的功能無(wú)可替代部默,它們依然是機(jī)器學(xué)習(xí)領(lǐng)域的寵兒侵蒙。

思考:PCA和特征選擇技術(shù)都是特征工程的一部分,它們有什么不同傅蹂?
特征工程中有三種方式:特征提取纷闺,特征創(chuàng)造和特征選擇。仔細(xì)觀察上面的降維例子和上周我們講解過(guò)的特征選擇贬派,你發(fā)現(xiàn)有什么不同了嗎?

特征選擇是從已存在的特征中選取攜帶信息最多的急但,選完之后的特征依然具有可解釋性澎媒,我們依然知道這個(gè)特征在原數(shù)據(jù)的哪個(gè)位置搞乏,代表著原數(shù)據(jù)上的什么含義。

而PCA戒努,是將已存在的特征進(jìn)行壓縮请敦,降維完畢后的特征不是原本的特征矩陣中的任何一個(gè)特征,而是通過(guò)某些方式組合起來(lái)的新特征储玫。通常來(lái)說(shuō)侍筛,在新的特征矩陣生成之前,我們無(wú)法知曉PCA都建立了怎樣的新特征向量撒穷,新特征矩陣生成之后也不具有可讀性匣椰,我們無(wú)法判斷新特征矩陣的特征是從原數(shù)據(jù)中的什么特征組合而來(lái),新特征雖然帶有原始數(shù)據(jù)的信息端礼,卻已經(jīng)不是原數(shù)據(jù)上代表著的含義了禽笑。以PCA為代表的降維算法因此是特征創(chuàng)造(feature creation,或feature construction)的一種蛤奥。

可以想見(jiàn)佳镜,PCA一般不適用于探索特征和標(biāo)簽之間的關(guān)系的模型(如線性回歸),因?yàn)闊o(wú)法解釋的新特征和標(biāo)簽之間的關(guān)系不具有意義凡桥。在線性回歸模型中蟀伸,我們使用特征選擇。

2.2 重要參數(shù)n_components

n_components是我們降維后需要的維度缅刽,即降維后需要保留的特征數(shù)量啊掏,降維流程中第二步里需要確認(rèn)的k值,一般輸入[0, min(X.shape)]范圍中的整數(shù)衰猛。一說(shuō)到K迟蜜,大家可能都會(huì)想到,類(lèi)似于KNN中的K和隨機(jī)森林中的n_estimators腕侄,這是一個(gè)需要我們?nèi)藶槿ゴ_認(rèn)的超參數(shù)小泉,并且我們?cè)O(shè)定的數(shù)字會(huì)影響到模型的表現(xiàn)芦疏。如果留下的特征太多,就達(dá)不到降維的效果微姊,如果留下的特征太少酸茴,那新特征向量可能無(wú)法容納原始數(shù)據(jù)集中的大部分信息,因此兢交,n_components既不能太大也不能太小薪捍。那怎么辦呢?

可以先從我們的降維目標(biāo)說(shuō)起:如果我們希望可視化一組數(shù)據(jù)來(lái)觀察數(shù)據(jù)分布配喳,我們往往將數(shù)據(jù)降到三維以下酪穿,很多時(shí)候是二維,即n_components的取值為2晴裹。

2.2.1 迷你案例:高維數(shù)據(jù)的可視化

  1. 調(diào)用庫(kù)和模塊
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
  1. 提取數(shù)據(jù)集
iris = load_iris()
y = iris.target
X = iris.data
#作為數(shù)組被济,X是幾維?
X.shape
#作為數(shù)據(jù)表或特征矩陣涧团,X是幾維只磷?
import pandas as pd
pd.DataFrame(X)
  1. 建模
#調(diào)用PCA
pca = PCA(n_components=2)           #實(shí)例化
pca = pca.fit(X)                    #擬合模型
X_dr = pca.transform(X)             #獲取新矩陣

X_dr
#也可以fit_transform一步到位
#X_dr = PCA(2).fit_transform(X)
  1. 可視化
    要將三種鳶尾花的數(shù)據(jù)分布顯示在二維平面坐標(biāo)系中,對(duì)應(yīng)的兩個(gè)坐標(biāo)(兩個(gè)特征向量)應(yīng)該是三種鳶尾花降維后的x1和x2泌绣,怎樣才能取出三種鳶尾花下不同的x1和x2呢钮追?
X_dr[y == 0, 0] #這里是布爾索引,看出來(lái)了么阿迈?

#要展示三中分類(lèi)的分布元媚,需要對(duì)三種鳶尾花分別繪圖
#可以寫(xiě)成三行代碼,也可以寫(xiě)成for循環(huán)

"""
plt.figure()
plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()
"""

colors = ['red', 'black', 'orange']
iris.target_names

plt.figure()
for i in [0, 1, 2]:
    plt.scatter(X_dr[y == i, 0]
                ,X_dr[y == i, 1]
                ,alpha=.7
                ,c=colors[i]
                ,label=iris.target_names[i]
               )
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

鳶尾花的分布被展現(xiàn)在我們眼前了苗沧,明顯這是一個(gè)分簇的分布刊棕,并且每個(gè)簇之間的分布相對(duì)比較明顯篙梢,也許versicolor和virginia這兩種花之間會(huì)有一些分類(lèi)錯(cuò)誤柔袁,但setosa肯定不會(huì)被分錯(cuò)。這樣的數(shù)據(jù)很容易分類(lèi)祠挫,可以遇見(jiàn)飒焦,KNN蜈膨,隨機(jī)森林,神經(jīng)網(wǎng)絡(luò)牺荠,樸素貝葉斯翁巍,Adaboost這些分類(lèi)器在鳶尾花數(shù)據(jù)集上,未調(diào)整的時(shí)候都可以有95%上下的準(zhǔn)確率休雌。

  1. 探索降維后的數(shù)據(jù)
#屬性explained_variance_灶壶,查看降維后每個(gè)新特征向量上所帶的信息量大小(可解釋性方差的大需厩)
pca.explained_variance_

#屬性explained_variance_ratio驰凛,查看降維后每個(gè)新特征向量所占的信息量占原始數(shù)據(jù)總信息量的百分比
#又叫做可解釋方差貢獻(xiàn)率
pca.explained_variance_ratio_
#大部分信息都被有效地集中在了第一個(gè)特征上

pca.explained_variance_ratio_.sum()
  1. 選擇最好的n_components:累積可解釋方差貢獻(xiàn)率曲線

當(dāng)參數(shù)n_components中不填寫(xiě)任何值胸懈,則默認(rèn)返回min(X.shape)個(gè)特征,一般來(lái)說(shuō)恰响,樣本量都會(huì)大于特征數(shù)目趣钱,所以什么都不填就相當(dāng)于轉(zhuǎn)換了新特征空間,但沒(méi)有減少特征的個(gè)數(shù)胚宦。一般來(lái)說(shuō)首有,不會(huì)使用這種輸入方式。但我們卻可以使用這種輸入方式來(lái)畫(huà)出累計(jì)可解釋方差貢獻(xiàn)率曲線枢劝,以此選擇最好的n_components的整數(shù)取值井联。

累積可解釋方差貢獻(xiàn)率曲線是一條以降維后保留的特征個(gè)數(shù)為橫坐標(biāo),降維后新特征矩陣捕捉到的可解釋方差貢獻(xiàn)率為縱坐標(biāo)的曲線您旁,能夠幫助我們決定n_components最好的取值烙常。

import numpy as np
pca_line = PCA().fit(X)
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #這是為了限制坐標(biāo)軸顯示為整數(shù)
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

2.2.2 最大似然估計(jì)自選超參數(shù)

除了輸入整數(shù),n_components還有哪些選擇呢被冒?之前我們提到過(guò)军掂,矩陣分解的理論發(fā)展在業(yè)界獨(dú)樹(shù)一幟,勤奮智慧的數(shù)學(xué)大神Minka, T.P.在麻省理工學(xué)院媒體實(shí)驗(yàn)室做研究時(shí)找出了讓PCA用最大似然估計(jì)(maximum likelihood estimation)自選超參數(shù)的方法昨悼,輸入“mle”作為n_components的參數(shù)輸入跃洛,就可以調(diào)用這種方法率触。

pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(X)
X_mle = pca_mle.transform(X)

X_mle
#可以發(fā)現(xiàn),mle為我們自動(dòng)選擇了3個(gè)特征

pca_mle.explained_variance_ratio_.sum()
#得到了比設(shè)定2個(gè)特征時(shí)更高的信息含量汇竭,對(duì)于鳶尾花這個(gè)很小的數(shù)據(jù)集來(lái)說(shuō)葱蝗,3個(gè)特征對(duì)應(yīng)這么高的信息含量,并不需要去糾結(jié)于只保留2個(gè)特征细燎,畢竟三個(gè)特征也可以可視化

2.2.3 按信息量占比選超參數(shù)

輸入[0,1]之間的浮點(diǎn)數(shù)两曼,并且讓參數(shù)svd_solver =='full',表示希望降維后的總解釋性方差占比大于n_components指定的百分比玻驻,即是說(shuō)悼凑,希望保留百分之多少的信息量。比如說(shuō)璧瞬,如果我們希望保留97%的信息量户辫,就可以輸入n_components = 0.97,PCA會(huì)自動(dòng)選出能夠讓保留的信息量超過(guò)97%的特征數(shù)量嗤锉。

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_

2.3 PCA中的SVD

2.3.1 PCA中的SVD哪里來(lái)渔欢?

細(xì)心的小伙伴可能注意到了,svd_solver是奇異值分解器的意思瘟忱,為什么PCA算法下面會(huì)有有關(guān)奇異值分解的參數(shù)奥额?不是兩種算法么苫幢?我們之前曾經(jīng)提到過(guò),PCA和SVD涉及了大量的矩陣計(jì)算垫挨,兩者都是運(yùn)算量很大的模型态坦,但其實(shí),SVD有一種驚人的數(shù)學(xué)性質(zhì)棒拂,即是它可以跳過(guò)數(shù)學(xué)神秘的宇宙伞梯,不計(jì)算協(xié)方差矩陣,直接找出一個(gè)新特征向量組成的n維空間帚屉,而這個(gè)n維空間就是奇異值分解后的右矩陣V^{T}(所以一開(kāi)始在講解降維過(guò)程時(shí)谜诫,我們說(shuō)”生成新特征向量組成的空間V",并非巧合攻旦,而是特指奇異值分解中的矩陣V^{T})喻旷。
傳統(tǒng)印象中的SVD:X →數(shù)學(xué)神秘的宇宙→ U\Sigma V^{T}\\其實(shí)會(huì)開(kāi)掛的SVD:X → 一個(gè)比起PCA簡(jiǎn)化非常多的數(shù)學(xué)過(guò)程 →V^{T}
右奇異矩陣V^{T}有著如下性質(zhì):
X_{dr} = X * V[:k]^T
k就是n_components,是我們降維后希望得到的維度牢屋。若X為(m,n)的特征矩陣且预,V^{T}就是結(jié)構(gòu)為(n,n)的矩陣,取這個(gè)矩陣的前k行(進(jìn)行切片)烙无,即將V轉(zhuǎn)換為結(jié)構(gòu)為(k,n)的矩陣锋谐。而V_{(k,n)}^T與原特征矩陣X相乘,即可得到降維后的特征矩陣X_dr截酷。這是說(shuō)涮拗,奇異值分解可以不計(jì)算協(xié)方差矩陣等等結(jié)構(gòu)復(fù)雜計(jì)算冗長(zhǎng)的矩陣,就直接求出新特征空間和降維后的特征矩陣迂苛。

簡(jiǎn)而言之三热,SVD在矩陣分解中的過(guò)程比PCA簡(jiǎn)單快速,雖然兩個(gè)算法都走一樣的分解流程三幻,但SVD可以作弊耍賴(lài)直接算出V就漾。但是遺憾的是,SVD的信息量衡量指標(biāo)比較復(fù)雜念搬,要理解”奇異值“遠(yuǎn)不如理解”方差“來(lái)得容易抑堡,因此,sklearn將降維流程拆成了兩部分:一部分是計(jì)算特征空間V锁蠕,由奇異值分解完成夷野,另一部分是映射數(shù)據(jù)和求解新特征矩陣,由主成分分析完成荣倾,實(shí)現(xiàn)了用SVD的性質(zhì)減少計(jì)算量悯搔,卻讓信息量的評(píng)估指標(biāo)是方差,具體流程如下圖:

講到這里,相信大家就能夠理解妒貌,為什么PCA的類(lèi)里會(huì)包含控制SVD分解器的參數(shù)了通危。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灌曙,隨后出現(xiàn)的幾起案子菊碟,更是在濱河造成了極大的恐慌,老刑警劉巖在刺,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆害,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚣驼,警方通過(guò)查閱死者的電腦和手機(jī)魄幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颖杏,“玉大人纯陨,你說(shuō)我怎么就攤上這事×舸ⅲ” “怎么了翼抠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)获讳。 經(jīng)常有香客問(wèn)我阴颖,道長(zhǎng),這世上最難降的妖魔是什么赔嚎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任膘盖,我火速辦了婚禮,結(jié)果婚禮上尤误,老公的妹妹穿的比我還像新娘。我一直安慰自己结缚,他們只是感情好损晤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著红竭,像睡著了一般尤勋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵宪,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天最冰,我揣著相機(jī)與錄音,去河邊找鬼稀火。 笑死暖哨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凰狞。 我是一名探鬼主播篇裁,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沛慢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了达布?” 一聲冷哼從身側(cè)響起团甲,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黍聂,沒(méi)想到半個(gè)月后躺苦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡产还,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年匹厘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕沉。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡集乔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坡椒,到底是詐尸還是另有隱情扰路,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布倔叼,位于F島的核電站汗唱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丈攒。R本人自食惡果不足惜哩罪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巡验。 院中可真熱鬧际插,春花似錦、人聲如沸显设。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捕捂。三九已至瑟枫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指攒,已是汗流浹背慷妙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允悦,地道東北人膝擂。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猿挚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咐旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345