1. 程式人生 > 其它 >機器學習——PCA(主成分分析)(轉載)

機器學習——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

有時會發現學習是一件很快樂的事情 比一直跑步容易多了 不是嘛