1. 程式人生 > >Andrew Ng 機器學習筆記 13 :降維(dimensionality reduction)

Andrew Ng 機器學習筆記 13 :降維(dimensionality reduction)

資料壓縮

我們希望使用降維的一個主要原因是資料壓縮。資料壓縮不僅減少了計算機記憶體和硬碟空間的佔用,它還能給演算法提速。

如果你有上百或者上千的特徵變數,很容易就會忘記你到底有什麼特徵變數,而且有時候可能有幾個不同的工程師團隊。這樣就很難搞清哪個隊給了你什麼特徵變數。實際上得到這樣冗餘的特徵變數並不難。

二維降到一維

降低維度後,得到一條線,基本所有資料對映到這條線上。之後可以直接測量這條線上每個樣本的位置。將這個新特徵叫做

z 1

在之前如果想要表示一個樣本點,需要一個二維向量( x 1 , x 2

),現在只需用一個一維向量 z 1 來表示這個樣本點。

三維降到二維

在更典型的降維例子中,我們可能有1000維的資料,我們可能想降低到100維

圖上這樣的資料集,我有一個樣本 x ( i ) 的集合, x ( i ) 是一個三維實數的點,所以我的樣本是三維的:

x ( i ) R 3

實際上,這些樣本點,差不多都處於同一平面上。降維在這裡的作用,就是把所有的資料,都投影到一個二維的平面內。

所以我們現在只需要兩個數: z 1 z 2 來表示點在平面上的位置即可:

視覺化資料

假如我們已經收集了大量的有關全世界不同國家的統計資料集:第一個特徵 x 1 是國家的國內生產總值;第二個特徵 x 2 是一個百分比,表示人均佔有的GDP;第三個特徵 x 3 是人類發展指數;第四個特徵 x 4 是預期壽命;…直到 x 50

為了使得我們能更好地來理解資料,我們需要對資料進行視覺化展示。這裡我們有50個特徵,但繪製一幅50維度的圖是異常困難的,因此我們需要對資料進行降維,然後再視覺化。

具體做法如下:

  • 我們用 z 1 z 2 這兩個數來總結50個維度的資料,我們可以使用這兩個數來繪製出這些國家的二維圖。

  • 在降維處理時,我們用 z 1 來表示那些象徵著國家整體情況的資料,例如”國家總面積”、”國家總體經濟水平”等;用 z 2 來表示象徵著人均情況的資料,例如”人均GDP”,”人均幸福感”等。

降維處理之後,將資料按照這兩個維度展示如下:

在圖中,右側的點,象徵著國家整體經濟比較好的國家;上方的點,象徵著人均經濟比較好、人均幸福感較高、人均壽命較長…的國家。

主成分分析(PCA)

對於降維問題來說,目前最流行最常用的演算法是主成分分析法(Principal Componet Analysis, PCA)。

PCA的執行過程2D -> 1D

如果我們將資料從二維降到一維的話,我們需要試著尋找一個向量 u ( i ) ,該向量屬於n維空間中的向量(在這個例子中是二維的),我們將尋找一個對資料進行投影的方向,使得投影誤差能夠最小(在這個例子裡,我們把PCA尋找到這個向量記做 u ( 1 ) ):

另外需要說明的時無論PCA給出的是這個 u ( 1 ) 是正還是負都沒關係。因為無論給的是正的還是負的 u ( 1 ) 它對應的直線都是同一條,也就是我將投影的方向。

因此PCA做的就是:尋找一組k維向量(一條直線、或者平面、或者諸如此類等等)對資料進行投影,來最小化正交投影誤差

PCA和線性迴歸的關係

不同點一:

如果我們做線性迴歸,我們做的是在給定某個輸入特徵x的情況下預測某個變數y的數值。因此對於線性迴歸,我們想做的是擬合一條直線,來最小化點和直線之間的平方誤差:

所以我們要最小化的是,上圖中藍線幅值的平方。注意我畫的這些藍色的垂直線,這是垂直距離。它是某個點與通過假設的得到的其預測值之間的距離。

與此相反,PCA要做的是最小化這些樣本點與直線的最短距離(直角距離):

不同點二:

更一般的是,做線性迴歸的時候,有一個特別的變數y作為我們即將預測的值,線性迴歸所要做的就是用x的所有的值來預測y。

而在PCA中,沒有這麼一個特殊的變數y是我們要預測的。我們所擁有的是特徵x1,x2,…,xn,所有的這些特徵都是被同樣地對待。

因此,PCA不是線性迴歸。儘管有一定程度的相似性,使得它們看上去是有關聯的,但它們實際上是非常不同的演算法。

資料預處理

在使用PCA之前,我們通常會有一個數據預處理的過程。

拿到某組有m個無標籤樣本的訓練集,一般先進行均值歸一化(mean normalization)。這一步很重要。然後還可以進行特徵縮放(feature scaling),這根據你的資料而定。

這跟我們之前在監督學習中提到的均值歸一和特徵縮放是一樣的。

PCA演算法

假如說我們想要把資料從n維降低到k維,我們首先要做的是計算出下面這個協方差矩陣(通常用∑來表示):

= 1 m i = 1 n ( x ( i ) ) ( x ( i ) ) T

計算出這個協方差矩陣後,假如我們把它存為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列向量。這樣我們就得到了 u ( 1 ) u ( k ) ,也就是我們用來投影資料的k個方向。

我們取出U矩陣的前k列得到一個新的,由 u ( 1 ) u ( k ) 組成的矩陣 U r e d u c e