Andrew Ng 機器學習筆記 13 :降維(dimensionality reduction)
資料壓縮
我們希望使用降維的一個主要原因是資料壓縮。資料壓縮不僅減少了計算機記憶體和硬碟空間的佔用,它還能給演算法提速。
如果你有上百或者上千的特徵變數,很容易就會忘記你到底有什麼特徵變數,而且有時候可能有幾個不同的工程師團隊。這樣就很難搞清哪個隊給了你什麼特徵變數。實際上得到這樣冗餘的特徵變數並不難。
二維降到一維
降低維度後,得到一條線,基本所有資料對映到這條線上。之後可以直接測量這條線上每個樣本的位置。將這個新特徵叫做 。
在之前如果想要表示一個樣本點,需要一個二維向量( , ),現在只需用一個一維向量 來表示這個樣本點。
三維降到二維
在更典型的降維例子中,我們可能有1000維的資料,我們可能想降低到100維
圖上這樣的資料集,我有一個樣本
的集合,
是一個三維實數的點,所以我的樣本是三維的:
實際上,這些樣本點,差不多都處於同一平面上。降維在這裡的作用,就是把所有的資料,都投影到一個二維的平面內。
所以我們現在只需要兩個數: 和 來表示點在平面上的位置即可:
視覺化資料
假如我們已經收集了大量的有關全世界不同國家的統計資料集:第一個特徵 是國家的國內生產總值;第二個特徵 是一個百分比,表示人均佔有的GDP;第三個特徵 是人類發展指數;第四個特徵 是預期壽命;…直到
為了使得我們能更好地來理解資料,我們需要對資料進行視覺化展示。這裡我們有50個特徵,但繪製一幅50維度的圖是異常困難的,因此我們需要對資料進行降維,然後再視覺化。
具體做法如下:
我們用 和 這兩個數來總結50個維度的資料,我們可以使用這兩個數來繪製出這些國家的二維圖。
在降維處理時,我們用 來表示那些象徵著國家整體情況的資料,例如”國家總面積”、”國家總體經濟水平”等;用 來表示象徵著人均情況的資料,例如”人均GDP”,”人均幸福感”等。
降維處理之後,將資料按照這兩個維度展示如下:
在圖中,右側的點,象徵著國家整體經濟比較好的國家;上方的點,象徵著人均經濟比較好、人均幸福感較高、人均壽命較長…的國家。
主成分分析(PCA)
對於降維問題來說,目前最流行最常用的演算法是主成分分析法(Principal Componet Analysis, PCA)。
PCA的執行過程2D -> 1D
如果我們將資料從二維降到一維的話,我們需要試著尋找一個向量 ,該向量屬於n維空間中的向量(在這個例子中是二維的),我們將尋找一個對資料進行投影的方向,使得投影誤差能夠最小(在這個例子裡,我們把PCA尋找到這個向量記做 ):
另外需要說明的時無論PCA給出的是這個 是正還是負都沒關係。因為無論給的是正的還是負的 它對應的直線都是同一條,也就是我將投影的方向。
因此PCA做的就是:尋找一組k維向量(一條直線、或者平面、或者諸如此類等等)對資料進行投影,來最小化正交投影誤差。
PCA和線性迴歸的關係
不同點一:
如果我們做線性迴歸,我們做的是在給定某個輸入特徵x的情況下預測某個變數y的數值。因此對於線性迴歸,我們想做的是擬合一條直線,來最小化點和直線之間的平方誤差:
所以我們要最小化的是,上圖中藍線幅值的平方。注意我畫的這些藍色的垂直線,這是垂直距離。它是某個點與通過假設的得到的其預測值之間的距離。
與此相反,PCA要做的是最小化這些樣本點與直線的最短距離(直角距離):
不同點二:
更一般的是,做線性迴歸的時候,有一個特別的變數y作為我們即將預測的值,線性迴歸所要做的就是用x的所有的值來預測y。
而在PCA中,沒有這麼一個特殊的變數y是我們要預測的。我們所擁有的是特徵x1,x2,…,xn,所有的這些特徵都是被同樣地對待。
因此,PCA不是線性迴歸。儘管有一定程度的相似性,使得它們看上去是有關聯的,但它們實際上是非常不同的演算法。
資料預處理
在使用PCA之前,我們通常會有一個數據預處理的過程。
拿到某組有m個無標籤樣本的訓練集,一般先進行均值歸一化(mean normalization)。這一步很重要。然後還可以進行特徵縮放(feature scaling),這根據你的資料而定。
這跟我們之前在監督學習中提到的均值歸一和特徵縮放是一樣的。
PCA演算法
假如說我們想要把資料從n維降低到k維,我們首先要做的是計算出下面這個協方差矩陣(通常用∑來表示):
計算出這個協方差矩陣後,假如我們把它存為Octave中的一個名為Sigma的變數,我們需要做的是計算出Sigma矩陣的特徵向量(eigenvectors)。
在Octave中,你可以使用如下命令來實現這一功能:
[U,S,V] = svd(Sigma);
這個協方差矩陣Sigma應該是一個n×n的矩陣,通過定義可以發現這是一個n×1的向量,和它自身的轉置(一個1×n的向量)相乘得到的結果,這個結果自然是一個n×n的矩陣。
然後把這n個n×n的矩陣加起來,當然還是n×n矩陣。
然後svd將輸出三個矩陣,分別是U,S,V。你真正需要的是U矩陣。
U 矩陣也是一個n×n矩陣:
如果我們想將資料的維度從n降低到k的話,我們只需要提取前k列向量。這樣我們就得到了 到 ,也就是我們用來投影資料的k個方向。
我們取出U矩陣的前k列得到一個新的,由 到 組成的矩陣 :