降維是機器學習中很重要的壹種思想。在機器學習中經常會碰到壹些高維的數據集,它們會占用計算機的內存和硬盤空間,而且在運算時會減緩速度。
降維能夠使得數據量被壓縮,加快運算速度,減小儲存空間,以及方便可視化的觀察數據特點。
PS:在降維中,我們減少的是特征種類而不是樣本數量,樣本數量m不變,特征值數量n會減少。
壹種常用的降維算法是主成分分析算法(Principal Component Analysis),簡稱 PCA 。
PCA是通過找到壹個低維的線或面,然後將數據投影到線或面上去,然後通過減少投影誤差(即每個特征到投影的距離的平均值)來實現降維。
上圖是壹個包含二維特征值的樣本集。黑色的叉代表樣本,紅色的線表示找到的低維的線,綠色的叉則是樣本投影在線上的位置。而它們的投影距離就是PCA算法所需要考慮的。
通過上圖可以看出PCA算法就是找出壹個線,在數學上就是壹個向量,使得其他樣本投影到該向量上的距離最小。
推而廣之:
壹般情況下,將特征值的維度從n降到k,就是找到k個向量 ,使得樣本在這些向量上的投影最小。
例如,2維降到1維,就是找到1個向量,即壹條線;3維降到2維,就是找到2向量,即壹個平面。
數據處理
假設有m個樣本集:
下面需要對數據做壹下特征值縮放或者均值歸壹化。
先計算出平均值,然後用樣本值減去平均值。
然後用 替換 , 可以是數據最大值最小值的範圍或者標準差。
算法部分
我們需要的就是矩陣U,他是壹個n維方陣 ,它的每壹列就是我們需要的向量:
使用 矩陣可以降維:
那麽要回到原來的維度上去就需要:
這裏我們只能得到原來的近似值
與 近似相等,兩者之間的差就是投影誤差,或平均平方映射誤差:
數據的總變差(total variation),即樣本的長度平方的均值:
選擇維度k的最小值的方法:
表示平方投影誤差除以總變差的值小於0.01,用PCA的語言稱之為 保留了99%的差異性 。
PS:這個值是可以變化的,可以是95%,90%,85%等等。
使用循環驗證的辦法:
初始化 ,然後計算出 ,通過 計算出 和 ,然後通過上方的公式計算出值是不是小於0.01。
如果不是,增加k值,直到獲得最小的k值滿足條件。
快捷辦法
通過奇異值分解的到的矩陣 是壹個n維的對角矩陣:
通過這個矩陣可以來計算:
也可以用下面的式子:
這種方法就非常快捷高效。
我們在訓練集上通過PCA獲得矩陣 ,在交叉驗證集和測試集上就不能再使用PCA來計算矩陣了,而是直接用訓練集裏的矩陣來映射交叉驗證集和測試集上的數據。
PCA最常用的就是壓縮數據,加速算法的學習,或者可視化數據。
PCA的錯誤用法,用來防止算法過擬合
算法過擬合的原因之壹是算法過於復雜,特征值的維度過高,使用PCA可以降低維度,看起來會有效,但是實際上效果很差。防止算法過擬合還是使用正則化的方法來實現。
還有壹個註意點。就是在設計壹個機器學習算法時,不用壹開始就考慮降維,先在不使用PCA的條件下設計算法,當算法出現問題,例如,算法計算過慢,占用大量內存...,之後當確定需要使用PCA的時候再繼續使用。