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代表這一列樣本的均值。
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)$,$(2\sqrt{2},0)$,$(3\sqrt{2},0)$。可以注意到,x2*上的數值此時都變成了0,因此x2*明顯不帶有任何有效信息了(此時x2*的方差也為0了)。此時,x1*特徵上的數據均值是$2\sqrt{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,或者其他的任何語言,在大型矩陣運算上都不是特別擅長,無論代碼如何簡化,我們不可避免地要等待計算機去完成這個非常龐大的數學計算過程。因此,降維算法的計算量很大,運行比較緩慢,但無論如何,它們的功能無可替代,它們依然是機器學習領域的寵兒。