第八章——降維(Dimensionality Reduction)


機器學習問題可能包含成百上千的特征。特征數量過多,不僅使得訓練很耗時,而且難以找到解決方案。這一問題被稱為維數災難(curse of dimensionality)。為簡化問題,加速訓練,就需要降維了。

降維會丟失一些信息(比如將圖片壓縮成jpeg格式會降低質量),所以盡管會提速,但可能使模型稍微變差。因此首先要使用原始數據進行訓練。如果速度實在太慢,再考慮降維。

8.1 維數災難(The Curse of Dimensionality)

我們生活在三維空間,連四維空間都無法直觀理解,更別說更高維空間了(wiki有關四維空間的介紹,以及油管上的一個視頻,將四維空間展開為三維空間)。高維空間和低維空間相比,還是用很大區別的。比如一個單位正方形,只有大概0.4%的部分是距離邊界0.001以內的(這部分邊緣的面積大概是$0.001 \times 1 \times 4 = 0.004$,占總體面積的0.4%)。但是在一個一萬維的單位超立方體中,這一概率卻變成了99.999999%,絕大多數點都在距離某一維度很近的地方。一個有趣的事實是,人類有許多不同的屬性,你認識的所有人都可能是某一特征的極端分子(比如咖啡里的放糖量)。

還有一個更麻煩的區別:如果在單位正方形中任意選取兩點,其距離平均大概是0.52(這道概率統計的習題,我已經不記得怎么求解了)。在單位立方體中這一距離是0.66。而在1000000維單位超立方體中,這一距離就增大到了408.25(大概$\sqrt{1000000/6}$)。這說明高維數據集很可能是相當稀疏的,樣本實例間距離很大,預測是新的樣本距離訓練集樣本的距離也很大,預測可信度遠低於地位數據集。簡單來說,高維數據集很容易過擬合。

理論上,維數災難的一個解決方案是增加樣本數量,從而使訓練集達到足夠的密度。可是這在實踐中並不可行,因為其復雜度是指數級的。

8.2 主要降維方法(Main Approaches for Dimensionality Reduction) 

8.2.1 投影(Projection)

如圖8-2所示,可將三維數據集投影到合適的二維平面,

圖8-2. 幾乎位於同一平面的3D數據集

投影后的新數據集如圖8-3所示。

圖8-3. 投影和的2D數據集

但有時候,投影是不好使的,例如圖8-4所示的蛋糕卷數據集,盡管該數據集也是近似位於一個二維平面的(該數據集正確的降維方式是將蛋糕卷展開的二維平面)。

8-4. Swiss roll數據集

 

8.2.2 流形學習(Manifold Learning)

上面的蛋糕卷數據集就是一個2D流形。簡單來講,2D流形是一個在更高維空間中扭曲的2D形狀。 當然,2D流形可以推廣到n維流形。

許多降維算法就是對數據集所處於的流形建模,這被稱作流行學習。

8.3 主成分分析(PCA)

主成分分析(Principal Component Analysis)是目前最受歡迎的降維算法。該算法首先找到距離數據集最近的低維超平面,然后就數據集投射到該超平面。

8.3.1 保留方差(Preserving the Variance)

將數據集投影到低維超平面之前,首先要選擇合適的超平面。如圖8-7所示,左側是一個二維數據集,以及三個超平面(一維超平面)。右側是數據集在相應超平面做投影后得到的新數據集。

圖8-7. 選擇合適的子空間

很明顯應該選擇那條實心直線作為超平面,因為投影后新的數據集方差最大,損失的信息最少。此外,該超平面對應的新數據集,與原始數據集的歐氏距離最小。

8.3.2 主成分(Principal Components)

PCA可以識別出最大程度地保留訓練數據集差異(variance)的坐標軸,也就是圖8-7中的實線。然后找出第二個坐標軸,最大程度地保留剩下的差異,也就是圖中與實線正交的虛線。用單位向量表示第$i$個坐標軸,這被稱作第$i$個主成分。

可以使用奇異值分解(Singular Value Decomposition,SVD)得到主成分,$X = U \cdot \Sigma \cdot V^T$。

主成分矩陣:

\begin{align*}
V^T = \begin{pmatrix}
| &| & &| \\
c_1 &c_2 &\cdots &c_n \\
| &| & &|
\end{pmatrix}
\end{align*}

NumPy的svd() 函數可以進行奇異值分解:

X_centered = X - X.mean(axis=0)
U, s, V = np.linalg.svd(X_centered)

PCA假設數據集是以原點為中心的,只不過Scikit-Learn的PAC類會自動進行中心化。

8.3.3 投影到d維(Projecting Down to d Dimensions)

最佳超平面由前d個主成分向量組成,將訓練集投影到該超平面即可,代碼如下:

W2 = V.T[:, :2]
X2D = X_centered.dot(W2)

8.3.4 使用Scikit-Learn  

from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X2D = pca.fit_transform(X) 

8.3.5 可解釋方差比例(Explained Variance Ratio)

>>> print(pca.explained_variance_ratio_)
array([ 0.84248607, 0.14631839])

這說明第一個主成分承擔了84.2%的差異,第二個主成分承擔了14.6%的差異。

8.3.6 維數選擇

與其武斷地選擇多殺維,不如選擇足夠保留大部分差異(比如95%)的維數。以下代碼獲取足以保留95%差異的代碼:

pca = PCA()
pca.fit(X)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1 

然后設置n_components=d重新執行PCA:

pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X) 

另一個選擇是以維數為自變量,可釋方差(explained variance)為因變量,畫出函數圖形:

8.3.7 PCA用於壓縮

在MNIST數據集應用PCA,保留95%的差異,僅需150個特征,遠小於原始的784個特征,這是一個不錯的壓縮率。壓縮之后還可以解壓縮到784維,但這並不能得到原始數據,只是跟選擇數據很接地,畢竟壓縮做投影的時候丟失了一些信息。

8.3.8 Incremental PCA

 感覺類似於最小批梯度下降

8.3.9 隨機PCA(Randomized PCA)

 可以加速運算

8.4 核PCA(Kernel PCA)

核PCA就是將核技巧應用於PCA,代碼如下:

from sklearn.decomposition import KernelPCA
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
X_reduced = rbf_pca.fit_transform(X)

圖8-10. 使用不同核將蛋糕卷數據集投影到2維

8.4.1 核的選擇與超參數的調整(Selecting a Kernel and Tuning Hyperparameters)

這有兩種情況。

第一種情況,盡管kPCA是無監督算法,沒有明顯的衡量指標幫助我們調整參數。減少降維的下一步往往是監督學習,比如分類。這就可以選擇使得分類效果最好的參數。

第二種情況,完全是無監督學習,這是可以選擇使得重構誤差(reconstruction error)最小的超參數。

8.5 局部線性嵌入(Locally Linear Embedding,LLE)

LLE是另一種強大的非線性降維(nonlinear dimensionality reduction,NLDR)技術。該算法並不像PCA那樣依賴投影,而是首先尋找每一個訓練兩本與其k個近鄰(closest neighbors,c.n.)的線性關系,然后找到數據集的一種低維表示,其能夠將這些近鄰關系最好地保持。該算法對於卷曲數據集表現很好,尤其是噪聲不多的情況下。

from sklearn.manifold import LocallyLinearEmbedding
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
X_reduced = lle.fit_transform(X)

  

圖8-12. 展開蛋糕卷數據集

如圖8-12所示,蛋糕卷被展開了。然而,如果數據的范圍過大,距離並不能良好的保持下來:蛋糕卷左側被擠壓,右側被拉伸。

LLE工作方式如下:

首先,對於每一個訓練樣本$X^{(i)}$,識別出其$k$近鄰,然后建立$X^{(i)}$與其$k$近鄰的線性方程。

LLE第一步,局部線性關系模型:

然后,將訓練集映射(這里是映射,也就是map,不是前面的投影projecting)到d維空間(d<n),並盡可能地保持局部關系。

LLE第二步,降維並保留局部關系:

8.6 其它的降維技術(Other Dimensionality Reduction Techniques)

  • Multidimensional Scaling (MDS),保持樣本距離降維。
  • Isomap,在樣本的近鄰間創建圖,降維時保持geodesic distances。
  • t-Distributed Stochastic Neighbor Embedding (t-SNE),降維時保持相似樣本接近,不相似樣本遠離。這在樣本可視化時很有用,尤其是樣本簇的可視化。
  • Linear Discriminant Analysis (LDA),這實際上是一個分類算法,在訓練的時候可以學習到最能區別類別的坐標軸,然后用這些坐標軸定義超平面並將樣本映射於其上。其優勢是可以盡可能地保持樣本點分離,可以再應用分離算法(比如SVM)之前使用LDA。

圖8-13. 不同算法將蛋卷數據集映射到2維

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM