python pca降维_机器学习之sklearn中的降维算法
1. PCA與SVD
sklearn中降維算法都被包括在模塊decomposition中,這個模塊本質是一個矩陣分解模塊。在過去的十年中,如果要討論算法進步的先鋒,矩陣分解可以說是獨樹一幟。矩陣分解可以用在降維,深度學習,聚類分析,數據預處理,低緯度特征學習,推薦系統,大數據分析等領域。在2006年,Netflix曾經舉辦了一個獎金為100萬美元的推薦系統算法比賽,最后的獲獎者就使用了矩陣分解中的明星:奇異值分解SVD。(~o ̄3 ̄)~菊安醬會講SVD在推薦系統中的應用,大家不要錯過!
SVD和主成分分析PCA都屬于矩陣分解算法中的入門算法,都是通過分解特征矩陣來進行降維,它們也是我們今天要說的重點。雖然是入門算法,卻不代表PCA和SVD簡單:下面兩張圖是我在一篇SVD的論文中隨意截取的兩頁,可以看到滿滿的數學公式(基本是線性代數)。要想給大家講明白這些公式,我講完不吐血大家聽完也吐血了。所以今天,我會用最簡單的方式為大家呈現降維算法的原理,但這注定意味著大家無法看到這個算法的全貌,在機器學習中逃避數學是邪道,所以更多原理大家自己去閱讀。
在降維過程中,我們會減少特征的數量,這意味著刪除數據,數據量變少則表示模型可以獲取的信息會變少,模型的表現可能會因此受影響。同時,在高維數據中,必然有一些特征是不帶有有效的信息的(比如噪音),或者有一些特征帶有的信息和其他一些特征是重復的(比如一些特征可能會線性相關)。我們希望能夠找出一種辦法來幫助我們衡量特征上所帶的信息量,讓我們在降維的過程中,能夠即減少特征的數量,又保留大部分有效信息——將那些帶有重復信息的特征合并,并刪除那些帶無效信息的特征等等——逐漸創造出能夠代表原特征矩陣大部分信息的,特征更少的,新特征矩陣。
上周的特征工程課中,我們提到過一種重要的特征選擇方法:方差過濾。如果一個特征的方差很小,則意味著這個特征上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那這一個特征的取值對樣本而言就沒有區分度,這種特征就不帶有有效信息。從方差的這種應用就可以推斷出,如果一個特征的方差很大,則說明這個特征上帶有大量的信息。因此,在降維中,PCA使用的信息量衡量指標,就是樣本方差,又稱可解釋性方差,方差越大,特征所帶的信息量越多。
Var代表一個特征的方差,n代表樣本量,xi代表一個特征中的每個樣本取值,xhat代表這一列樣本的均值。
面試高危問題方差計算公式中為什么除數是n-1?這是為了得到樣本方差的無偏估計,更多大家可以自己去探索~
2. 降維究竟是怎樣實現?
class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
PCA作為矩陣分解算法的核心算法,其實沒有太多參數,但不幸的是每個參數的意義和運用都很難,因為幾乎每個參數都涉及到高深的數學原理。為了參數的運用和意義變得明朗,我們來看一組簡單的二維數據的降維。
我們現在有一組簡單的數據,有特征x1和x2,三個樣本數據的坐標點分別為(1,1),(2,2),(3,3)。我們可以讓x1和x2分別作為兩個特征向量,很輕松地用一個二維平面來描述這組數據。這組數據現在每個特征的均值都為2,方差則等于:
每個特征的數據一模一樣,因此方差也都為1,數據的方差總和是2。
現在我們的目標是:只用一個特征向量來描述這組數據,即將二維數據降為一維數據,并且盡可能地保留信息量,即讓數據的總方差盡量靠近2。于是,我們將原本的直角坐標系逆時針旋轉45°,形成了新的特征向量x1*和x2*組成的新平面,在這個新平面中,三個樣本數據的坐標點可以表示為$(sqrt{2},0)$,$(2sqrt{2},0)$,$(3sqrt{2},0)$。可以注意到,x2*上的數值此時都變成了0,因此x2*明顯不帶有任何有效信息了(此時x2*的方差也為0了)。此時,x1*特征上的數據均值是$2sqrt{2}$,而方差則可表示成:
x1*上的數據均值為0,方差也為0。
此時,我們根據信息含量的排序,取信息含量最大的一個特征,因為我們想要的是一維數據。所以我們可以將x2*刪除,同時也刪除圖中的x2*特征向量,剩下的x1*就代表了曾經需要兩個特征來代表的三個樣本點。通過旋轉原有特征向量組成的坐標軸來找到新特征向量和新坐標平面,我們將三個樣本點的信息壓縮到了一條直線上,實現了二維變一維,并且盡量保留原始數據的信息。一個成功的降維,就實現了。
不難注意到,在這個降維過程中,有幾個重要的步驟:
在步驟3當中,我們用來找出n個新特征向量,讓數據能夠被壓縮到少數特征上并且總信息量不損失太多的技術就是矩陣分解。PCA和SVD是兩種不同的降維算法,但他們都遵從上面的過程來實現降維,只是兩種算法中矩陣分解的方法不同,信息量的衡量指標不同罷了。PCA使用方差作為信息量的衡量指標,并且特征值分解來找出空間V。降維時,它會通過一系列數學的神秘操作(比如說,產生協方差矩陣$frac{1}{n}XX^{T}$)將特征矩陣X分解為以下三個矩陣,其中$Q$和$Q^{-1}$是輔助的矩陣,Σ是一個對角矩陣(即除了對角線上有值,其他位置都是0的矩陣),其對角線上的元素就是方差。降維完成之后,PCA找到的每個新特征向量就叫做“主成分”,而被丟棄的特征向量被認為信息量很少,這些信息很可能就是噪音。
而SVD使用奇異值分解來找出空間V,其中Σ也是一個對角矩陣,不過它對角線上的元素是奇異值,這也是SVD中用來衡量特征上的信息量的指標。U和V^{T}分別是左奇異矩陣和右奇異矩陣,也都是輔助矩陣。
在數學原理中,無論是PCA和SVD都需要遍歷所有的特征和樣本來計算信息量指標。并且在矩陣分解的過程之中,會產生比原來的特征矩陣更大的矩陣,比如原數據的結構是(m,n),在矩陣分解中為了找出最佳新特征空間V,可能需要產生(n,n),(m,m)大小的矩陣,還需要產生協方差矩陣去計算更多的信息。而現在無論是Python還是R,或者其他的任何語言,在大型矩陣運算上都不是特別擅長,無論代碼如何簡化,我們不可避免地要等待計算機去完成這個非常龐大的數學計算過程。因此,降維算法的計算量很大,運行比較緩慢,但無論如何,它們的功能無可替代,它們依然是機器學習領域的寵兒。
思考:PCA和特征選擇技術都是特征工程的一部分,它們有什么不同?
特征工程中有三種方式:特征提取,特征創造和特征選擇。仔細觀察上面的降維例子和上周我們講解過的特征選擇,你發現有什么不同了嗎?特征選擇是從已存在的特征中選取攜帶信息最多的,選完之后的特征依然具有可解釋性,我們依然知道這個特征在原數據的哪個位置,代表著原數據上的什么含義。而PCA,是將已存在的特征進行壓縮,降維完畢后的特征不是原本的特征矩陣中的任何一個特征,而是通過某些方式組合起來的新特征。通常來說,在新的特征矩陣生成之前,我們無法知曉PCA都建立了怎樣的新特征向量,新特征矩陣生成之后也不具有可讀性,我們無法判斷新特征矩陣的特征是從原數據中的什么特征組合而來,新特征雖然帶有原始數據的信息,卻已經不是原數據上代表著的含義了。以PCA為代表的降維算法因此是特征創造(feature creation,或feature construction)的一種。可以想見,PCA一般不適用于探索特征和標簽之間的關系的模型(如線性回歸),因為無法解釋的新特征和標簽之間的關系不具有意義。在線性回歸模型中,我們使用特征選擇。
總結
以上是生活随笔為你收集整理的python pca降维_机器学习之sklearn中的降维算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA集成Scala图文教程详细步骤
- 下一篇: 【五】Java数组