小伙伴們大家好~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代表一個(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晶姊,方差則等于:
每個(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)可以表示為胰坟,
笔横,
竞滓∷浣纾可以注意到涛菠,x2*上的數(shù)值此時(shí)都變成了0撇吞,因此x2*明顯不帶有任何有效信息了(此時(shí)x2*的方差也為0了)。此時(shí)迄薄,x1特征上的數(shù)據(jù)均值是
讥蔽,而方差則可表示成:
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é)方差矩陣)將特征矩陣X分解為以下三個(gè)矩陣,其中
和
是輔助的矩陣,Σ是一個(gè)對(duì)角矩陣(即除了對(duì)角線上有值,其他位置都是0的矩陣),其對(duì)角線上的元素就是方差。降維完成之后跌帐,PCA找到的每個(gè)新特征向量就叫做“主成分”,而被丟棄的特征向量被認(rèn)為信息量很少,這些信息很可能就是噪音。
而SVD使用奇異值分解來(lái)找出空間V,其中Σ也是一個(gè)對(duì)角矩陣颈娜,不過(guò)它對(duì)角線上的元素是奇異值梆奈,這也是SVD中用來(lái)衡量特征上的信息量的指標(biāo)乓梨。U和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ù)的可視化
- 調(diào)用庫(kù)和模塊
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
- 提取數(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)
- 建模
#調(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)
-
可視化
要將三種鳶尾花的數(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)確率休雌。
- 探索降維后的數(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()
- 選擇最好的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維空間就是奇異值分解后的右矩陣(所以一開(kāi)始在講解降維過(guò)程時(shí)谜诫,我們說(shuō)”生成新特征向量組成的空間V",并非巧合攻旦,而是特指奇異值分解中的矩陣
)喻旷。
右奇異矩陣有著如下性質(zhì):
k就是n_components,是我們降維后希望得到的維度牢屋。若X為(m,n)的特征矩陣且预,就是結(jié)構(gòu)為(n,n)的矩陣,取這個(gè)矩陣的前k行(進(jìn)行切片)烙无,即將V轉(zhuǎn)換為結(jié)構(gòu)為(k,n)的矩陣锋谐。而
與原特征矩陣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ù)了通危。