西瓜書第10章-降維PCA(主成分分析)

西瓜書第10章講解的是降維度量學(xué)習(xí)的相關(guān)內(nèi)容

image

維度

對于數(shù)組和Series而言,維度就是shape返回的數(shù)值。shape中 返回了幾個數(shù)字,就是幾維。

索引以外的數(shù)據(jù),不分行列的稱之為一維,有行列之分的稱之為二維,也稱之為表。一張表最多是二維的。

數(shù)組中的每張表可以是一個特征矩陣或者一個DataFrame行是樣本,列是特征。

筆記:維度指的是樣本的數(shù)量或者特征的數(shù)量;一般情況下,指的是特征數(shù)量。n個特征就是n維

對于圖像而言,維度就是圖像中特征向量的數(shù)量。特征向量可以理解成坐標軸。

降維decompositon

降維算法中降維指的是:降低特征矩陣中特征的數(shù)量。

sklearn中的降維算法在decomposition中。模塊的本質(zhì)是矩陣分解模塊。代表是SVD奇異值分解。

主成分分析中的常見的模塊:

  • 主成分分析PCA

  • 增量主成分分析IPCA,Incremental PCA

  • 核主成分分析KPCA,Kernel PCA

  • 小批量稀疏主成分分析,MiniBatchSparse PCA

  • 稀疏主成分分析,Sparse PCA

  • 截斷的SVD,Truncated SVD

高級矩陣分解

  1. 具有在線變分貝葉斯算法的隱含狄利克雷分布,LatenDirichletAllocation

  2. 非負矩陣分解,NMF

  3. 稀疏編碼,SparseCoder

在降維的過程中,會減少特征的數(shù)量,則意味著需要刪除數(shù)據(jù):減少特征數(shù)量、保留大部分有效信息

方差過濾

如果一個特征的方差

  • 過?。禾卣魃虾芸赡苡泻芏嘞嗤娜≈担瑓^(qū)分度很低,有效信息少

  • 過大:特征上帶有大量的有效信息

筆記:PCA中就是使用樣本方差作為信息衡量的指標。樣本方差越大,可解釋型越強,特征所帶的信息越多

  • Var是特征的方差

  • n是樣本數(shù)量

  • ?代表的是一個特征中的每個樣本取值

  • ?代表的是這一列樣本的均值

為什么是n-1

為了得到樣本方差的無偏估計。為什么樣本方差的分母是n-1

降維demo

通過一個二維降低到一維的栗子來說明降維的實現(xiàn)過程

image
x_1 x_2
1 1
2 2
3 3

上面原始數(shù)據(jù)中,兩個特征的均值都是2,方差都是?;總方差都是2

逆時針旋轉(zhuǎn)45度之后變成了

x_1 x_2
\sqrt 2 0
2\sqrt 2 0
3\sqrt 2 0

x_2的均值和方差都是0;x_1的均值是2\sqrt 2;方差是2??偡讲钜彩?code>2

筆記:PCA中取得是信息量較大的特征,即方差較大,所以特征?可以刪除,二維變成了一維,保留了原始數(shù)據(jù)的信息。

降維基本步驟

將二維矩陣和n維矩陣進行類比,掌握降維算法的基本過程:

過程 二維特征矩陣 n維特征矩陣
1 找出2個特征對應(yīng)的直角坐標系 找出原本的n個特征向量構(gòu)成的n維空間V
2 決定降維之后的特征數(shù)量:1 決定降維之后的特征數(shù)量:k
3 旋轉(zhuǎn),找出一個新的坐標系; 本質(zhì)上是找出2個新的特征向量,構(gòu)成新平面 新特征向量能夠被壓縮到較少的特征上,總信息量損失不多 通過某種變化,找出n個新的特征變量,以及它們構(gòu)成的新n維空間V
4 將原始數(shù)據(jù)在新坐標系上的坐標找出來 找出原始數(shù)據(jù)在特征空間V上的對應(yīng)的值,“將新的數(shù)據(jù)映射到新空間中”
5 選取方差最大的特征向量,刪除沒有被選中的特征,降低到1維 選取前k個信息量最大的特征,從n維降低k維

筆記:步驟3中,找出n個新特征向量,將數(shù)據(jù)壓縮到少數(shù)特征上,且總信息量不能損失過多的技術(shù),主要是矩陣分解

PCA

思想

PCA(Principal Component Analysis)是一種常用的數(shù)據(jù)分析方法,屬于一種無監(jiān)督學(xué)習(xí)的算法。PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維。

參考文章PCA數(shù)學(xué)原理

內(nèi)積和投影

內(nèi)積定義

兩個維度相同向量(機器學(xué)習(xí)中一般是指列向量)的內(nèi)積被定義成
(a_1,a_2,...,a_n)^T\cdot (b_1,b_2,...,b_n)^T = a_1b_1+a_2b_2+...+a_nb_n
內(nèi)積將兩個向量映射成為一個實數(shù)

內(nèi)積的幾何意義
image

A=(x_1,y_1),B=(x_2,y_2),\alpha為它們之前的夾角,投影的矢量長度|A|cos(\alpha),|A|=\sqrt{x_1^2+y_1^2}表示模,也就是A線段的標量長度。內(nèi)積的另一種表示形式為
A\cdot B=|A||B|cos(\alpha)
也就是A到B的投影長度乘以B的模。特殊情況下,如果B的模是1,那么內(nèi)積結(jié)果就是A到B的投影長度。

基的產(chǎn)生

一個二維向量可以對應(yīng)二維笛卡爾直角坐標系中從原點出發(fā)的一個有向線段。代數(shù)中常用線段的終點坐標表示向量,例如下面的(3,2)。

實際上向量(3,2)表示的是在X軸上的投影是3,Y軸上的投影是2。

筆記:投影是矢量,可以是負值,與方向有關(guān)。

image

在二維坐標系中,向量(x,y)實際上表示為線性組合:

x(1,0)^T+y(0,1)^T
那么,(1,0)和(0,1)可以看做是二維空間中的一組基。

筆記:實際上任何兩個線性無關(guān)的二維向量都可以成為一組基,所謂線性無關(guān)在二維平面內(nèi)可以直觀認為是兩個不在一條直線上的向量。

例如,(1,1)和(-1,1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內(nèi)積的意義可以看到,如果基的模是1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標了。上面的基變成了(\frac{1}{\sqrt2},\frac{1}{\sqrt2})、(-\frac{1}{\sqrt2},\frac{1}{\sqrt2}),即除以了各自的模\sqrt2。

那么(3,2)在這組基下的新坐標為(\frac{5}{\sqrt2},-\frac{1}{\sqrt2})

3*\frac{1}{\sqrt2}+2*\frac{1}{\sqrt 2}
3*(-\frac{1}{\sqrt2})+2*\frac{1}{\sqrt 2}

image

筆記:一般情況基是正交的,就是說內(nèi)積為0,直觀來說是相互垂直的。

基變換的矩陣表示

矩陣的兩行表示兩個基,乘以原來的向量,得到新基下的坐標。


image

一般的,如果我們有MN維向量,想將其變換為由RN維向量表示的新空間中

  • 首先將R個基按行組成矩陣A,就是整個P向量
  • 然后將向量按列組成矩陣B,就是整個a向量
  • 兩矩陣的乘積AB就是變換結(jié)果,其中AB的第m列為A中第m列變換后的結(jié)果
image

兩個矩陣相乘的意義是:將右邊矩陣中的每列列向量變換到左邊矩陣中的每一行行向量作為基所表示的空間中去。

筆記:不同的基能夠?qū)ν唤M數(shù)據(jù)進行不同的表示?;臄?shù)量小于向量本身的維數(shù),能夠達到降維的效果

方差與協(xié)方差矩陣

去中心化

將所有的字段減去字段均值,結(jié)果變成了每個字段都變成了均值為0

方差

一個字段的方差可以看做是每個元素與字段均值\mu的差的平方和的均值
Var(a)=\frac{1}{m}\sum^m_{i=1}(a_i-\mu)^2
由于每個字段的均值變成了0,那么總的方差可以簡寫成
Var(a)=\frac{1}{m}\sum_{i=1}^ma_i^2Var(a)=\frac{1}{m}\sum_{i=1}^ma_i^2

筆記:將每個方差加起來再除以總樣本數(shù)m

協(xié)方差

數(shù)學(xué)上可以用兩個字段的協(xié)方差表示其相關(guān)性
Cov(a,b)=\frac{1}{m-1}\sum_{i=1}^m(a_i-\mu_a)(b_i-\mu_b)
當(dāng)均值為0,上面的協(xié)方差公式可以表示為
Cov(a,b)=\frac{1}{m}\sum_{i=1}^ma_ib_i
當(dāng)樣本數(shù)較大時,不必在意其是 m 還是 m-1,為了方便計算,我們分母取 m。

筆記:如果只是單純地選擇方差最大的方向,后續(xù)的方向應(yīng)該會和方差最大的方向接近重合,就導(dǎo)致了字段是線性相關(guān)的。我們不希望字段之間存在相關(guān)性。

當(dāng)協(xié)方差為0,表示兩個字段完全獨立;為了讓協(xié)方差為0,第二個基應(yīng)當(dāng)在和第一個基正交的方向上(垂直方向

協(xié)方差矩陣

協(xié)方差矩陣是\frac{1}{m-1}\sum^m_{i=1}x_ix_i^T

image
  • 對角線上是兩個字段的方差
  • 其他元素是協(xié)方差
協(xié)方差矩陣對角化
  • 除去對角線上的元素,其他全部變成0
  • 對角線上的元素從大到小,從上往下排列

原始的協(xié)方差矩陣是C,P是一組基按行組成的矩陣,設(shè)Y=PX,Y對應(yīng)的協(xié)方差矩陣是D

image

由于C是一個對稱矩陣,滿足:

  1. 實對稱矩陣不同特征值對應(yīng)的特征向量必然正交
  2. 設(shè)特征向量\lambda重數(shù)為r,則必然存在r個線性無關(guān)的特征向量對應(yīng)于\lambda,因此可以將r個特征向量單位正交化

e代表的是單位向量,對于協(xié)方差矩陣C的結(jié)論如下:

image

那么P是協(xié)方差矩陣的特征向量單位化后按行排列出的矩陣,P=E^T

優(yōu)化目標
  • 選擇K個基之后最大程度地保留原有的信息
  • K個基是單位正交基
  • 原始數(shù)據(jù)映射到這組基上,各個字段之間的協(xié)方差為0,字段的總方差盡可能大。

解決方法:希望投影后的投影值盡量地分散。滿足的條件是:

  • 最近重構(gòu)性:樣本點到投影平面(空間)的距離足夠近
  • 最大可分性:樣本點在投影平面上的投影盡可能的分開

PCA算法

  1. 輸入:樣本集D和低維空間維度k
  2. 具體過程
    • 所有樣本進行去中心化x_i := x_i-\hat x
    • 計算所有樣本的協(xié)方差矩陣XX^T
    • 對協(xié)方差矩陣做特征值分解
    • 取最大的k個特征值所對應(yīng)的特征向量w_1,w_2,…,w_k
  3. 輸出投影矩陣:W^*=(w_1,w_2,…,w_k)

PCA實例

image

\lambda_1比較大,所以使用c_1作為基

sklearn中PCA的使用

重要的參數(shù)是n_components,降維之后需要保留的特征數(shù)量,取值在[0, min(X.shape)]。如果不填寫,默認是min(X.shape)

包導(dǎo)入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA   # 導(dǎo)入PCA模塊

數(shù)據(jù)導(dǎo)入

iris = load_iris()
X = iris.data
y = iris.target

X.shape  # 2維數(shù)組
pd.DataFrame(X)  # 4維的特征矩陣
image

PCA降維

# 調(diào)用PCA實現(xiàn)降維
pca = PCA(n_components=2)   # 實例化
pca = pca.fit(X)  # 傳入特征矩陣,擬合模型
X_dr = pca.transform(X)  # 獲取新矩陣
X_dr.shape

# 一步到位的寫法:X_dr = PCA(2).fit_transform(X)

可視化

X_dr[y == 0, 0]   # 鳶尾花為第0種的第1列特征的數(shù)據(jù);X_dr[y == 0, 1]  第2列特征的數(shù)據(jù) 

如何取出每種鳶尾花的兩個特征中的數(shù)據(jù)


image
plt.figure()
plt.scatter(X_dr[y == 0, 0],X_dr[y == 0, 1],c='red',label=iris.target_names[0])
plt.scatter(X_dr[y == 1, 0],X_dr[y == 1, 1],c='green',label=iris.target_names[1])
plt.scatter(X_dr[y == 2, 0],X_dr[y == 2, 1],c='orange',label=iris.target_names[2])
plt.legend()
plt.title("PCA of IRIS dataset")
plt.show()

# for循環(huán)實現(xiàn)
colors = ["red", "green", "orange"]
plt.figure()
for i in range(3):
    plt.scatter(X_dr[y == i, 0]
               ,X_dr[y == i, 1]
               ,alpha = 0.7
               ,c = colors[i]
               ,label = iris.target_names[i])
    
plt.legend()
plt.title("PCA of IRIS dataset")
plt.show()
image

降維之后數(shù)據(jù)的信息探索

主要是兩個屬性

image

累計可解釋方差

當(dāng)n_components中不填寫任何值,默認是min.(X.shape)個特征。通過累計可解釋性方差貢獻率曲線來選擇最好的n_components。曲線橫縱坐標分別是:

  • 降維后保留的特征個數(shù)

  • 累積可解釋性方差貢獻率

# numpy中額cumsum來累積計算
pca_line = PCA().fit(X)   # PCA后面沒有填寫n_components值
plt.plot([1,2,3,4], np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4])  # 保證橫坐標是整數(shù),不會出現(xiàn)1.5
plt.xlabel("Number of components after dimension reduction")
plt.ylabel("Cumulative explained variance")
plt.show()
image

結(jié)果表明選擇2個或者3個特征是比較好的

基于極大似然估計MLE的PCA

n_components中不僅可以填寫數(shù)字,還可以通過極大似然估計MLE來自選超參數(shù)

image

按照指定的信息占比選擇參數(shù)

輸入0-1之間的浮點數(shù),并且配合參數(shù)svd_solver="full",表示希望降維后的可解釋方差占原始數(shù)據(jù)的信息比例。

pca_f = PCA(n_components=0.97, svd_solver="full")
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)  # 返回降維后的特征矩陣

# 不同的占比
pca_f = PCA(n_components=0.99, svd_solver="full")
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
pca_f.explained_variance_ratio_.sum()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容