目錄html
主成分分析,即分析「主成分」,找到「主成分」,英文是 Principal Component Analysis,簡稱 PCA。算法
常常和 PCA 一塊兒出現的另外一個詞是降維(decomposition),當原始數據有成千甚至上萬個特徵的時候,降維能夠節約空間,下降算法運行的開銷,後面咱們能夠看到,PCA 的這種降維方式能夠用於數據的可視化,還有去噪聲的噪聲。機器學習
在這裏要說明的一點是:PCA 是方法,降維是思想,PCA != 降維, 降維還有不少方法,直接去掉一些無關的特徵,也是降維,PCA 降維是線性降維,還有非線性降維,固然這裏會扯出不少東西,不在我現有能解釋的範圍內。學習
本質上主成分分析是找到一個歐式空間的線性變換,把原始數據從「一組舊的標準正交基下的表示」轉化成「另外一組新的標準正交基下的表示」,降維發生在新的標準正交基下的表示,直接去掉了後面幾個維度的座標值。spa
這裏我使用了一些「線性代數」中的概念和表述,但請你不要擔憂,所有在你的射程範圍以內,主成分分析的思想其實並不深奧,只是被一些書籍用過於複雜的數學公式寫得比較高大上,我倒以爲主成分分析是複習「線性代數」基礎知識的絕佳材料。code
在初中,咱們就學習過「從不一樣方向看物體」。PCA 應用於降維是想找到一個適合的方向看物體,去掉一些不過重要的特徵,而後應用於建模。htm
請看下面這張圖,左邊是我斜着拿一支筆,三維空間中的一支筆,你在二維平面內你還可以看出是一支筆。若是我把這支筆像右邊這張圖那樣展現給你,你有可能認爲我拿着一個藍色小球。blog
在三維空間裏看到二維平面其實就是降維,降維之後的物體不是原來的物體,但能夠做爲原來物體的近似。繼承
顯而易見降維會帶來損失,但若是損失的信息並非咱們關注的主要的信息,其實並不妨礙咱們對本來事物的認識。再看上面的左圖,這個角度比較完整地展示了一支筆的全貌,咱們能夠看出這是一隻藍色水筆,還有不少墨水沒有用完,而右邊的圖,只從這支筆的底部看,雖然也是降維,可是丟失了不少信息,以致於咱們有可能不知道這竟然是一支筆。這說明在咱們有限的視野範圍內觀察一個事務,找對角度很關鍵。北宋詩人蘇軾有名詩句《題西林壁》傳頌至今:事務
橫當作嶺側成峯,
遠近高低各不一樣。
不識廬山真面目,
只緣身在此山中。
說的就是若是你置身於廬山之中,便看不清廬山的全貌。
那麼在 PCA 中,降維是如何發生的呢?請看下面這張圖。
降維最直接的作法就是去掉一個維度的信息,這件事情就叫作朝着座標軸「投影」,從左邊這張圖中,能夠看出,投影到 \(x\) 軸可能更好一些,由於投影到 \(x\) 軸之後,數據更接近原始數據的樣子。
而 PCA 用於降維的思想只是在這個基礎上多作了一步:先將座標軸進行旋轉,旋轉到如右圖所示,\(x\) 軸儘可能擬合原始數據的分佈,而後將原始數據投影到 \(x\) 軸上,很明顯,這樣獲得的數據的近似表示比左邊那張圖要好,一樣是二維降到一維,右邊的方法損失的信息更少。
再看看我前面拿筆的那兩張圖,右邊的圖之因此降維效果差,是由於咱們選擇的角度把藍色水筆重要的維度給丟棄了。
還能夠經過下面的例子來理解 PCA 降維的思想。
整數 \(125\) 能夠有如下兩種分解方式:
分析:
依據矩陣分解的相關理論,更換之後的座標系,從大到小包含了原始矩陣的信息,在降維的時候,咱們就能夠根據須要,保留前面的座標軸,去掉尾巴的座標軸,獲得數據的降維表示。數據仍是那個數據,維數減小了,但信息沒有丟失多少,咱們認爲這是一件划算的事情。
整理一下,PCA 用於降維主要分爲兩步,第一步旋轉座標軸,第二步去掉一些特徵,進而留下的特徵能夠做爲原始數據的近似。在機器學習中,第一步能夠認爲是特徵抽取或者是特徵轉換,而第二步能夠認爲是特徵選擇。即 「PCA = 特徵抽取 + 特徵選擇」。
這裏要說明一點:其實 PCA 變換座標軸不必定是旋轉,還有多是對座標系作了鏡像,咱們這裏不妨只理解成 PCA 旋轉了座標軸到一個合適的位置便可。
其實這個問題上面一部分已經回到了,即原始數據在旋轉之後的座標軸上進行投影更接近原始數據的分佈。這樣說仍是有些抽象,二維三維空間還好理解,高維空間就很差理解了。如何用數學的表示描述這件事情呢?咱們慢慢說。
咱們在作特徵工程的時候,實際上就是在處理各類二維表格。舉一個簡單的例子,下面是一張成績表,每一行是一個數據,一個數據組成的有序實數就是座標,例如,表示張三的成績,就能夠用一個列向量 \((80,100,85)^T\) 來表示。
姓名 | 語文 | 數學 | 英語 |
---|---|---|---|
張三 | \(80\) | \(100\) | \(85\) |
李四 | \(78\) | \(90\) | \(80\) |
王五 | \(82\) | \(70\) | \(82\) |
趙六 | \(79\) | \(80\) | \(87\) |
這是咱們在機器學習中處理的數據。那麼座標是什麼呢?談座標必定不能離開座標系,咱們在畫這張表的時候,在內心就已經創建了一個座標系,這個座標系是約定速成的,以至於不用說明,那麼這我的爲創建的座標系是什麼呢?
翻一翻《線性代數》教材,描述「座標」的語言必定是「向量在什麼什麼基底下的座標」。那麼畫出上面的成績表的手,咱們選用的基底是什麼呢?
很簡單,基底其實就是「語文成績」、「數學成績」、「英語成績」。若是分別把「語文成績」、「數學成績」、「英語成績」表示成 \(x\) 軸、\(y\) 軸、\(z\) 軸,而且讓它們都是單位向量,能夠寫成以下形式:
\[ \vec x= \begin{bmatrix}1\\0\\0\\\end{bmatrix}, \vec y= \begin{bmatrix}0\\1\\0\\\end{bmatrix}, \vec z= \begin{bmatrix}0\\0\\1\\\end{bmatrix}, \]
那麼張三的成績 \((80,100,85)^T\) 能夠寫成:
\[ \begin{bmatrix}80\\100\\85\\\end{bmatrix} = 80\begin{bmatrix}1\\0\\0\\\end{bmatrix}+ 100\begin{bmatrix}0\\1\\0\\\end{bmatrix}+ 85\begin{bmatrix}0\\0\\1\\\end{bmatrix}, \]
這裏個人描述可能比較囉嗦,但我想你應該很容易明白我在說什麼,由於這實際上是咱們你們都約定速成的事情。
談到這裏,很天然的一個問題是,如何找到一個合適的座標系呢?即如何找到新的座標系的各個座標軸(即「基底」)呢?在這裏咱們要使用一些「線性代數」的概念和記號,不要擔憂,你都能想起來。
爲了說清楚後面的內容,這裏咱們會用一些「線性代數」的語言,若是你忘記了一些概念,能翻一翻書查一查資料是最好的,我再介紹一些概念的時候,可能會直接給出一些結論,不會展開了,由於再展開就是抄書了,你最好想想或者翻翻書,但若是手邊沒有這樣的條件,也能夠選擇性跳過一些內容。固然我會用盡可能通俗的語言幫你們回憶起曾經你學習過的知識,其實它們很是有用。
咱們知道座標軸是基底,基底其實就是一組向量(不是一個向量),通常咱們將每一個向量單位化。取單位向量是由於將任意向量投影到單位向量的那個標量值好算,空間中的座標就是向量依次投影到各個座標軸的值,這個是是一個標量,帶符號的。
這個結論我想是很顯然,也容易理解。例如,\((80,100,85)^T\) 投影到 \((1,0,0)^T\) 就是 \(85\),即 \((80,100,85)^T\) 的第 \(1\) 個份量,注意 \((1,0,0)^T\) 是單位向量,纔有這麼好的性質,通常狀況下的投影要根據投影公式計算。
再補充一句,咱們選擇一組向量成爲基底,不只僅但願它們都是單位向量,咱們還但願這組基底裏面的單位向量單位互相垂直,垂直也叫正交,此時,既是單位向量且相互正交的基底是標準正交基,上面的 \((1,0,0)^T\)、\((0,1,0)^T\)、\((0,0,1)^T\) 就是一組標準正交基,標準正交基有很是良好的性質:
若是使用標準正交基,向量在新的基底的座標表示,就能夠經過這個向量依次和標準正交基裏的每個基向量作內積,獲得的標量組成向量,便是向量在新的基底的座標表示。
這個結論是很是重要的,若是忘記了的朋友們請必定翻一翻《線性代數》教材,描述「正交變換」的部分,簡單來講就是由於正交(垂直)的緣故,作內積的時候,不一樣的基向量的內積成爲了 \(0\),本身和本身作內積的時候,由於是單位向量,內積就是 \(1\),標準正交基簡化了座標的計算,通過後面的分析,咱們能夠看到,經過 PCA 找到的新的座標系的基底剛好就是標準正交基。
談到這裏,你必定明白了,計算新座標系下的座標,其實就是計算原始座標在新座標軸下的投影,這個投影在新座標軸是標準正交基的狀況下,就成爲了內積的計算。
在這裏咱們假設原始數據的座標組成的矩陣是 \(X\),\(X\) 的每一行表示一個數據,\(X\) 的每一列表示一個特徵。原始數據在新座標軸下的矩陣是 \(Y\),一樣 \(Y\) 的每一行表示一個數據,\(Y\) 的每一列表示一個特徵。而假設新座標軸的基底的每個基向量按列排成矩陣 \(P\)。則矩陣 \(X\)、\(Y\)、\(P\) 之間有以下關係:
\[ XP = Y \]
咱們知道矩陣乘法的定義是左邊矩陣的每一行和右邊矩陣的每一列分別相乘之後再相加,這就是內積的定義。經過上面的分析,咱們知道 \(P\) 是各個座標軸,這些座標軸是單位向量而且相互正交,計算到一個向量到它們的座標,就是計算投影,計算投影就是計算內積。
到這裏咱們捋一捋,\(X\) 是咱們已知的,\(P\) 是咱們待求的,\(X\)、\(P\) 知道了 \(Y\) 就求出來了。如何求出 \(P\) 呢?咱們經過分析 \(Y\) 應該知足的性質,進而就能獲得 \(P\) 了。
在線性迴歸中,咱們知道,若是一個特徵(即數據矩陣的一個列)在數值上都差很少,其實這一列對迴歸的結果沒有什麼幫助,它的係數幾乎爲 0,能夠收縮到偏置項中。
所以,送入機器學習的算法的數據的特徵,咱們喜歡特徵在數值有區分度,那麼數值的區分度用什麼度量呢?其實在中學咱們就接觸過這個概念了:方差。
方差表示了一組數據離散的程度,方差大是各類機器學習算法喜歡的樣子,方差小的,表示這組數據在數值上差異不大,差異很小的時候做爲特徵就能夠被忽略了。機器學習算法庫 scikit-learn 就專門有用於特徵選的類 sklearn.feature_selection.VarianceThreshold
,它的做用很簡單,就是幫助咱們移除方差小的特徵。
在生活中也有這樣的例子,差異不大的特徵每每不是區分個體的主要因素。例如:女士在擇偶的時候,每每會看重男士的家庭背景,擁有的資產多少。在男士的身高、體重、顏值要求上,可能只是這樣的描述,身高不低於多少釐米,體重不超過多少公斤,顏值不要過低,年齡不要太大諸如此類。由於其實身高、體重、顏值,除了極個別的,全世界的成年人類放在一塊兒比較,都不會差太多。可是家庭背景、知識、學識、見識、資產是能夠有極端差異的,是具備區分度的。身高、體重、顏值在繼承後代上帶來的優點遠不如「背景、知識、學識、見識、資產」能帶給後代的多。
因而咱們指望通過 PCA 之後,獲得的原始數據在新座標軸下的表示矩陣 \(Y\) 具備這樣的形式:\(Y\) 的第一列方差最大,\(Y\) 的第二列方差次之,以此類推,\(Y\) 的最後一列方差最小。用投影的語言再描述一遍就是:原始數據在新座標系的第一個座標軸上的投影的方差最大,原始數據在新座標系的第二個座標軸上的投影的方差次之,依次類推。
仍是從線性迴歸提及,若是兩個特徵線性相關,這個現象叫作「多重共線性」,一個特徵能夠用另外一個特徵線性表示,那麼就能夠去掉一個特徵,即去掉冗餘的特徵。例如「年齡」和「出生年」,由年齡能夠推出出生年,一樣由出生年也能夠推出年齡,「出生年」就能夠被去掉。
那麼兩個特徵之間的線性線性相關性用什麼來衡量呢?這就是「協方差」。
第 1 點提到了方差,第 2 點提到了協方差,在數學上,有一個概念把它們聯繫在了一塊兒,那就是「協方差矩陣」。
咱們把上面第 1 點和第 2 點對矩陣 \(Y\) 的要求寫出來就是:
\(Y\) 的各個列向量的方差逐漸減小;
\(Y\) 的不一樣列向量線性無關。
把矩陣 \(Y\) 按列分塊,寫成列向量的形式 \(Y=(y_1,y_2,\cdots,y_n)\),這裏每個份量應該看出一個列向量,這樣 \(Y\) 才構成矩陣,咱們能夠以下這樣構造一個矩陣:
\[ \cfrac{1}{m-1}Y^TY \]
這裏 \(Y^T\) 是 \(Y\) 的轉置。若是你對這個矩陣感到陌生的話,你不妨動筆寫一寫:
\[ \cfrac{1}{m-1} \begin{bmatrix} y_1^T\\y_2^T\\ \vdots \\ y_n^T \end{bmatrix} \begin{bmatrix} y_1,y_2,\cdots,y_n \end{bmatrix} =\cfrac{1}{m-1}\begin{bmatrix} y_1^T y_1 & y_1^T y_2 & \cdots & y_1^T y_n \\ y_2^T y_1 & y_2^T y_2 & \cdots & y_2^T y_n \\ \vdots & \vdots & \ddots & \vdots \\ y_n^T y_1 & y_n^T y_2 & \cdots & y_n^T y_n \end{bmatrix} \]
能夠看到,把前面的係數 \(\cfrac{1}{m-1}\) 放進矩陣之後,這個矩陣主對角線上的元素,就是方差,非主對角線上的元素,就是不一樣列的協方差,而且還有一條很重要的性質:協方差矩陣是對稱矩陣。
所以,咱們把指望矩陣 \(Y\) 知足的兩個條件從新經過協方差矩陣 \(\cfrac{1}{m-1}Y^TY\) 描述就是:
因爲
\[ \cfrac{1}{m-1}Y^TY \]
是對角矩陣,又由於 \(XP=Y\) ,代入上式消去 \(Y\),即
\[ \begin{aligned} \cfrac{1}{m-1}Y^TY &= \cfrac{1}{m-1}(XP)^T(XP)\\ &=\cfrac{1}{m-1}(P^TX^T)(XP)\\ &=\cfrac{1}{m-1}(P^T(X^TX)P)\\ &=P^T \left(\cfrac{1}{m-1}X^TX \right)P\\ \end{aligned} \]
即咱們但願
\[ P^T \left(\cfrac{1}{m-1}X^TX \right)P \]
是對角矩陣。令 \(A= \left(\cfrac{1}{m-1}X^TX \right)\),便可以定義 \(A\) 是原始數據矩陣 \(X\) 的協方差矩陣,注意到 \(A\) 也是一個對稱矩陣,那麼問題就轉化成的問題了,解決這個問題的使用的是在「線性代數」中是使用得很是普遍的「對稱矩陣對角化」的相關結論。咱們簡述以下:
對一個對稱矩陣對角化的步驟就是對這個對稱矩陣進行特徵值分解;
正交矩陣表示的變換稱之爲正交變換,正交變換保持距離不變,保持內積(夾角)不變,所以正交變換施加於原始座標系能夠認爲是對原始座標系作了一次「旋轉」或「鏡像」。
\(P\) 的第 1 列就是主成分 1 ,\(P\) 的第 2 列就是主成分 2,以此類推。因而咱們能夠總結出 PCA 應用於降維的步驟。
這裏要特別說明的是,協方差和方差的定義中,都包括了減去均值這一操做,所以原始特徵矩陣 \(X\),咱們要將其每一列減去每一列的均值。