目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
在KNN算法中曾講到,對於高維數據,會出現數據樣本稀疏、距離計算困難等問題。可是這種問題並非僅僅針對KNN算法,只是在KNN算法中這種問題會被放大,而其餘的機器學習算法也會由於高維數據對訓練模型形成極大的障礙,這種問題通常被稱爲維數災難(curse of dimensionality)。算法
解決維數災難最經常使用的方法是降維(dimension reduction),即經過某種數學變換將原始高維特徵空間轉變爲一個低維子空間,在這個子空間中樣本密度大幅提升,距離計算也變得更容易。數據結構
# 維數災難和降維圖例 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties from sklearn.decomposition import PCA %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') np.random.seed(0) X = np.empty((100, 2)) X[:, 0] = np.random.uniform(0, 100, size=100) X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0, 10, size=100) pca = PCA(n_components=1) X_reduction = pca.fit_transform(X) X_restore = pca.inverse_transform(X_reduction) plt.scatter(X[:, 0], X[:, 1], color='g', label='原始數據') plt.scatter(X_restore[:, 0], X_restore[:, 1], color='r', label='降維後的數據') plt.annotate(s='',xytext=(40,60),xy=(65,30),arrowprops=dict(arrowstyle='-',color='b',linewidth=5)) plt.legend(prop=font) plt.show()
如上圖所示,綠點即原始高維空間中的樣本點,紅點即咱們降維後的樣本點。因爲圖中的高維是二維,低維是一維,因此樣本在低維空間是一條直線。dom
接下來咱們的目標就是聊一聊如何作到把高維空間樣本點映射到低維空間,即各類降維算法。機器學習
主成分分析(principal component analysis,PCA)是最經常使用的一種降維方法,咱們已經利用「維數災難和降維圖例」解釋了降維的過程,PCA的降維過程則是儘量的使用數據最主要的特徵來表明數據原有的全部特徵。可是有沒有同窗想過爲何使用PCA降維是上圖的紅點組成的線而不是藍線呢?這裏就須要說到咱們PCA的兩個條件了。函數
對於「維數災難和降維圖例」中的紅線和藍線咱們能夠把它當作一個超平面\(S\),理論上紅線和藍線構成的超平面均可以作到對樣本特徵的降維,可是通常咱們但願這種可以作到降維的超平面知足如下兩個條件學習
基於最近重構性和最大可分性,就能夠獲得主成分分析的兩種等價推導。優化
咱們首先從最近重構性推導PCA,即樣本點到這個超平面的距離足夠近。網站
假設\(m\)個\(n\)維數據\((x^{(1)},x^{(2)},\cdots,x^{(m)})\)都已經進行了中心化,即\(\sum_{i=1}^mx^{(i)}=0\);在假設投影變換後獲得的新座標系爲\(\{w_1,w_2,\cdots,w_n\}\),其中\(w_i\)是標準正交基向量,即\(||w_i||=1,w_i^Tw_j=0\),其中\(i\neq{j}\)。
若是把數據從\(n\)維降到\(n'\)維,即丟棄新座標系中的部分座標,則新的座標系爲\(\{w_1,w_2,\cdots,w_{n'}\}\),則樣本點\(x^{(i)}\)在\(n'\)維座標系中的投影爲
\[ z_{i} = (z_{i1},z_{i2},\cdots,z_{id'})^T \]
其中\(z_{ij}=w_j^Tx_i\),是\(x_i\)在低維座標系下第\(j\)維的座標。
若是咱們用\(z^{(i)}\)重構\(x^{(i)}\),則能夠恢復的原始數據爲
\[ \hat{x_i}=\sum_{j=1}^{d'}z_{ij}w_j \]
如今考慮整個樣本集,既能夠得到原樣本點\(x_i\)到基於投影重構的樣本點\(\hat{x_i}\)之間的距離爲
\[ \begin{align} \sum_{i=1}^m{||\hat{x_i}-x_i||}^2 & = \sum_{i=1}^m{||Wz_i-x_i||}^2 \\ & = \sum_{i=1}^m(Wz_i)^T(Wz_i)-2\sum_{i=1}^m(Wz_i)^Tx_i+\sum_{i=1}^mx_i^Tx_i \\ & = \sum_{i=1}^mz_i^Tz_i - 2\sum_{i=1}^mz_i^TW^Tx_i+\sum_{i=1}^mx_i^Tx_i \\ & = \sum_{i=1}^mz_i^Tz_i-2\sum_{i=1}^mz_i^Tz_i+\sum_{i=1}^mx_i^Tx_i \\ & = -\sum_{i=1}^mz_i^Tz_i + \sum_{i=1}^mx_i^Tx_i \\ & = -tr(W^T(\sum_{i=1}^mx_ix_i^T)W)+\sum_{i=1}^mx_i^Tx_i \\ & = -tr(W^TXX^TW)+\sum_{i=1}^mx_i^Tx_i \end{align} \]
因爲涉及過多矩陣推導,此處很少贅述,看不懂的能夠跳過。
其中\(W=(w_1,w_2,\cdots,w_d)\),其中\(\sum_{i=1}^mx_i^Tx_i\)是數據集的協方差矩陣,\(W\)的每個向量\(w_j\)是標準正交基,而\(\sum_{i=1}^mx_i^Tx_i\)是一個常量,最小化上式等價於
\[ \begin{align} & \underbrace{min}_W\,-tr(W^TXX^TW) \\ & s.t.\,W^TW=I \end{align} \]
主成分分析目標函數爲
\[ \begin{align} & \underbrace{min}_W\,-tr(W^TXX^TW) \\ & s.t.\,W^TW=I \end{align} \]
最小化該目標函數其實並不難,能夠發現最小化目標函數對應的\(W\)由協方差矩陣\(XX^T\)最大的\(n'\)個特徵值對應的特徵向量組成,利用拉格朗日乘子法可得
\[ J(W)=-tr(W^TXX^TW+\lambda_i(W^TW-I)) \]
對\(W\)求導等於0便可得
\[ \begin{align} & -XX^TW+\lambda{W}=0 \\ & XX^TW = \lambda{W} \end{align} \]
從上式能夠看出,\(W\)是\(XX^T\)的\(n'\)個特徵向量組成的矩陣,而\(\lambda\)有若干個特徵值組成的矩陣,特徵值在對角線上,其他位置爲0。當咱們將數據集從\(n\)維降到\(n'\)維時,須要找到最大的\(n'\)個特徵值對應的特徵向量。這個\(n'\)個特徵向量組成的矩陣\(W\)即咱們須要的矩陣。對於原始數據集,咱們只須要用\(z_i=W^Tx_i\),就能夠把原始數據集降到最小投影距離的\(n'\)維數據集。
從最大可分性出發,樣本點\(x_i\)在新空間中超平面的投影是\(W^Tx_i\),若是全部樣本點的投影儘量分開,則應該使投影后樣本點的方差最大化。
投影后樣本點的方差是\(\sum_{i=1}^mW^Tx_ix_i^TW\),所以目標函數能夠寫成
\[ \begin{align} & \underbrace{max}_W\,-tr(W^TXX^TW) \\ & s.t.\,W^TW=I \end{align} \]
上式其實和基於最近重構性推導PCA的目標函數其實差很少,其中一個是加負號的最小化,一個是最大化。
對基於最大可分性推導獲得的目標函數最大化,利用拉格朗日乘子法能夠獲得
\[ XX^TW = -\lambda{W} \]
PCA中,咱們假設存在一個線性的超平面,能夠對數據投影,但工業上大多數時候數據都是線性不可分的,這裏就須要用到和核SVM同樣的思想,即核主成分分析(kernelized PCA,KPCA),是基於核技巧對非線性可分數據進行降維。
KPCA首先會把數據從\(n\)維映射到更高的\(N\)維,讓數據線性可分後又會把數據映射回低維\(n'\),即\(n'<n<N\)。
假設咱們將在高維特徵空間把數據投影到由\(W=(w_1,w_2,\cdots,w_d)\)肯定的超平面上,則\(W\)爲
\[ ZZ^TW = (\sum_{i=1}^mz_iz_i^T)W=\lambda{W} \]
其中\(z_i\)是樣本點再高維特徵空間中的像,即特徵分解問題變爲
\[ \begin{align} W & = {\frac{1}{\lambda}}(\sum_{i=1}^mz_iz_i^T)W \\ & = \sum_{i=1}^mz_i{\frac{z_i^TW}{\lambda}} \\ & = \sum_{i=1}^mz_i\alpha_i^j \end{align} \]
其中\(a_i^j={\frac{1}{\lambda}}z_i^TW\)是\(\alpha_i\)的第\(j\)個份量。
假設\(z_i\)是由原始樣本點\(x_i\)經過映射\(\phi\)產生,即\(z_i=\phi(x_i)\),則特徵分解問題變爲
\[ (\sum_{i=1}^m\phi(x_i)\phi(x_i)^T)W = \lambda{W} \]
\(W\)變爲
\[ W=\sum_{i=1}^m\phi(x_i)\alpha_i^j \]
因爲咱們並不知道\(\phi\)是什麼,通常狀況下\(\phi\)不須要顯示計算,經過核函數轉換便可。所以引入核函數
\[ k(x_i,x_j)=\phi(x_i)^T\phi(x_j) \]
將核函數和\(w_j\)代入特徵分解問題,可得
\[ K\alpha^j=\lambda\alpha^j \]
其中\(K\)爲\(k\)對應的核矩陣,對於上述特徵值分解問題,去\(K\)最大的\(d'\)個特徵值對應的特徵向量便可。
對於新樣本\(x\),他投影后的第\(j\quad(j=1,2,\cdots,d')\)維座標爲
\[ \begin{align} z_j & = W^T\phi(x) \\ & = \sum_{i=1}^m\alpha_i^j\phi(x_i)^T\phi(x) \\ & = \sum_{i=1}^m\alpha_i^jk(x_i,x) \end{align} \]
從上述特徵分解能夠看出,KPCA須要對全部樣本求和,所以它的計算開銷較大。
樣本集\(D=\{x_1,x_2,\cdots,x_n\}\);低維空間維數\(n'\)。
降維後的樣本集\(D'\)。
降維後低維空間的維數\(n'\)一般是用戶事先指定的,通常選擇使用交叉驗證的方法選擇最好的\(n'\)值。對於PCA,有時候也會從重構的角度指定一個降維到的主成分比重閾值\(t\),這個閾值的範圍通常是\((0,1]\),而後選取使下式成立的最小\(n'\)值
\[ {\frac{\sum_{i=1}^{n'}\lambda_i}{\sum_{i=1}^{n}\lambda_i}}\geq{t} \]
PCA做爲一個無監督學習的降維方法,只須要對特徵值分解,就能夠壓縮數據,對數據去噪聲。可是PCA仍是有很多缺點的,針對PCA的缺點,也出現了不少PCA的變種,如解決非線性數據降維的KPCA;解決內存限制的增量的Incremental PCA;解決稀疏數據降維的Sparse PCA等。
因爲PCA涉及過多的數學公式,以及有着較強邏輯和空間處理。若是不是很懂能夠結合代碼而後多看幾遍。