機器學習——PCA(主成分分析)(轉載)
主成分分析(Principal components analysis,以下簡稱PCA)是最常用的降維方法之一,在資料壓縮和消除冗餘方面具有廣泛的應用,本文由淺入深的對其降維原理進行了詳細總結。
1. 向量投影和矩陣投影的含義
如下圖:
向量a在向量b的投影為:
其中,θ是向量間的夾角 。
向量a在向量b的投影表示向量a在向量b方向的資訊,若θ=90°時,向量a與向量b正交,向量a無向量b資訊,即向量間無冗餘資訊 。因此,向量最簡單的表示方法是用基向量表示,如下圖:
向量表示方法:
其中,c1是在e1方向的投影,c2是在e2方向的投影,e1和e2是基向量
我們用向量的表示方法擴充套件到矩陣
,其中ai(i=1,2,...,n)為n個維度的列向量,那麼矩陣A的列向量表示為:
其中,e1,e2,...,en為矩陣A的特徵向量 。
若矩陣A是對稱矩陣,那麼特徵向量為正交向量,我們對上式結合成矩陣的形式:
由上式可知,對稱矩陣A在各特徵向量的投影等於矩陣列向量展開後的係數,特徵向量可理解為基向量。
2. 向量降維和矩陣降維含義
向量降維可以通過投影的方式實現,N維向量對映為M維向量轉換為N維向量在M個基向量的投影,如N維向量在基向量的投影:
通過上式完成了降維,降維後的座標為:
矩陣是由多個列向量組成的,因此矩陣降維思想與向量降維思想一樣,只要求得矩陣在各基向量的投影即可,基向量可以理解為新的座標系,投影就是降維後的座標,那麼問題來了,如何選擇基向量
3. 基向量選擇演算法
已知樣本集的分佈,如下圖:
樣本集共有兩個特徵x1和x2,現在對該樣本資料從二維降到一維,圖中列了兩個基向量u1和u2,樣本集在兩個向量的投影表示了不同的降維方法,哪種方法好,需要有評判標準:(1)降維前後樣本點的總距離足夠近,即最小投影距離;(2)降維後的樣本點(投影)儘可能的散開,即最大投影方差 。因此,根據上面兩個評判標準可知選擇基向量u1較好。
我們知道了基向量的選擇標準,下面介紹基於這兩個評判標準來推導基向量:
(1)基於最小投影距離
假設有n個n維資料,記為X。現在對該資料從n維降到m維,關鍵是找到m個基向量,假設基向量為{w1,w2,...,wm},記為矩陣W,矩陣W的大小是n×m。
原始資料在基向量的投影:
投影座標計算公式:
根據投影座標和基向量,得到該樣本的對映點:
最小化樣本和對映點的總距離:
推導上式,得到最小值對應的基向量矩陣W,推導過程如下:
所以我們選擇的特徵向量作為投影的基向量。
(2) 基於最大投影方差
我們希望降維後的樣本點儘可能分散,方差可以表示這種分散程度。
如上圖所示,表示投影資料的平均值。所以最大化投影方差表示為:
下面推導上式,得到相應的基向量矩陣W,推導過程如下:
我們發現(4)式與上一節的(13)式是相同的。
因此,基向量矩陣W滿足下式:
小結:降維通過樣本資料投影到基向量實現的,基向量的個數等於降維的個數,基向量是通過上式求解的。
4. 基向量個數的確定
我們知道怎麼求解基向量,但是我們事先確定了基向量的個數,如上節的m個基向量,那麼怎麼根據樣本資料自動的選擇基向量的個數了?在回答這一問題前,簡單闡述下特徵向量和特徵值的意義。
假設向量wi,λi分別為的特徵向量和特徵值,表示式如下:
對應的圖:
由上圖可知,沒有改變特徵向量wi的方向,只在wi的方向上伸縮或壓縮了λi倍。特徵值代表了在該特徵向量的資訊分量。特徵值越大,包含矩陣的資訊分量亦越大。因此,我們可以用λi去選擇基向量個數。我們設定一個閾值threshold,該閾值表示降維後的資料保留原始資料的資訊量,假設降維後的特徵個數為m,降維前的特徵個數為n,m應滿足下面條件:
因此,通過上式可以求得基向量的個數m,即取前m個最大特徵值對應的基向量。
投影的基向量:
投影的資料集:
5. 中心化的作用
我們在計算協方差矩陣的特徵向量前,需要對樣本資料進行中心化,中心化的演算法如下:
中心化資料各特徵的平均值為0,計算過程如下:
對上式求平均:
中心化的目的是簡化演算法,我們重新回顧下協方差矩陣,以說明中心化的作用 。
,X表示共有n個樣本數。
每個樣本包含n個特徵,即:
展開:
為了閱讀方便,我們只考慮兩個特徵的協方差矩陣:
由(3)式推導(2)式得:
所以是樣本資料的協方差矩陣,但是,切記必須事先對資料進行中心化處理。
6. PCA演算法流程
1)樣本資料中心化。
2)計算樣本的協方差矩陣。
3)求協方差矩陣的特徵值和特徵向量,並對該向量進行標準化(基向量)。
3)根據設定的閾值,求滿足以下條件的降維數m。
4)取前m個最大特徵值對應的向量,記為W。
5)對樣本集的每一個樣本。
6)得到對映後的樣本集D'。
7. 核主成分分析(KPCA)介紹
因為可以用樣本資料內積表示:
由核函式定義可知,可通過核函式將資料對映成高維資料,並對該高維資料進行降維:
KPCA一般用在資料不是線性的,無法直接進行PCA降維,需要通過核函式對映成高維資料,再進行PCA降維。
8. PCA演算法總結
PCA是一種非監督學習的降維演算法,只需要計算樣本資料的協方差矩陣就能實現降維的目的,其演算法較易實現,但是降維後特徵的可解釋性較弱,且通過降維後資訊會丟失一些,可能對後續的處理有重要影響。
參考
https://www.cnblogs.com/pinard/p/6239403.html#undefined
A Singularly Valuable Decompostion: The SVD of a Matrix
9.PCA python呼叫
import pandas as pd import scipy.io as scio import matplotlib.pyplot as plt #載入matplotlib用於資料的視覺化 from sklearn.decomposition import PCA #載入PCA演算法包 data_n = scio.loadmat('../課件與相關資料/PCA/negative.mat') data_p = scio.loadmat('../課件與相關資料/PCA/positive.mat') data_n = pd.DataFrame(data_n['MITforest']) data_p = pd.DataFrame(data_p['bedroom']) data = pd.concat([data_n,data_p],axis=0) label = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] pca = PCA(n_components=2) # 載入PCA演算法,設定降維後主成分數目為2 reduced_X = pca.fit_transform(data) # 對原始資料進行降維,儲存在reduced_X中 n_x, n_y = [], [] p_x, p_y = [], [] for i in range(len(reduced_X)): if label[i] == 0: n_x.append(reduced_X[i][0]) n_y.append(reduced_X[i][1]) else: p_x.append(reduced_X[i][0]) p_y.append(reduced_X[i][1]) #分組,新增資料 plt.scatter(p_x, p_y, c='r', marker='x') plt.scatter(n_x, n_y, c='b', marker='D') plt.show() #繪圖
轉載於:https://mp.weixin.qq.com/s/AlHHCE5HrWdjVs3ggkTWsQ
有時會發現學習是一件很快樂的事情 比一直跑步容易多了 不是嘛