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

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

image

維度

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

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

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

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

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

降維decompositon

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

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

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

  • 主成分分析PCA

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

  • 核主成分分析KPCA,Kernel PCA

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

  • 稀疏主成分分析,Sparse PCA

  • 截?cái)嗟腟VD,Truncated SVD

高級(jí)矩陣分解

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

  2. 非負(fù)矩陣分解,NMF

  3. 稀疏編碼,SparseCoder

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

方差過濾

如果一個(gè)特征的方差

  • 過小:特征上很可能有很多相同的取值,區(qū)分度很低,有效信息少

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

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

  • Var是特征的方差

  • n是樣本數(shù)量

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

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

為什么是n-1

為了得到樣本方差的無(wú)偏估計(jì)。為什么樣本方差的分母是n-1

降維demo

通過一個(gè)二維降低到一維的栗子來(lái)說(shuō)明降維的實(shí)現(xiàn)過程

image
x_1 x_2
1 1
2 2
3 3

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

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

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

x_2的均值和方差都是0x_1的均值是2\sqrt 2;方差是2。總方差也是2

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

降維基本步驟

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

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

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

PCA

思想

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

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

內(nèi)積和投影

內(nèi)積定義

兩個(gè)維度相同向量(機(jī)器學(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)積將兩個(gè)向量映射成為一個(gè)實(shí)數(shù)

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

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

基的產(chǎn)生

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

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

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

image

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

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

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

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

那么(3,2)在這組基下的新坐標(biāo)為(\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

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

基變換的矩陣表示

矩陣的兩行表示兩個(gè)基,乘以原來(lái)的向量,得到新基下的坐標(biāo)。


image

一般的,如果我們有M個(gè)N維向量,想將其變換為由R個(gè)N維向量表示的新空間中

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

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

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

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

去中心化

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

方差

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

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

協(xié)方差

數(shù)學(xué)上可以用兩個(gè)字段的協(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ù)較大時(shí),不必在意其是 m 還是 m-1,為了方便計(jì)算,我們分母取 m。

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

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

協(xié)方差矩陣

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

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

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

image

由于C是一個(gè)對(duì)稱矩陣,滿足:

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

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

image

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

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

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

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

PCA算法

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

PCA實(shí)例

image

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

sklearn中PCA的使用

重要的參數(shù)是n_components,降維之后需要保留的特征數(shù)量,取值在[0, min(X.shape)]。如果不填寫,默認(rèn)是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實(shí)現(xiàn)降維
pca = PCA(n_components=2)   # 實(shí)例化
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ù) 

如何取出每種鳶尾花的兩個(gè)特征中的數(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)實(shí)現(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ù)的信息探索

主要是兩個(gè)屬性

image

累計(jì)可解釋方差

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

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

  • 累積可解釋性方差貢獻(xiàn)率

# numpy中額cumsum來(lái)累積計(jì)算
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])  # 保證橫坐標(biāo)是整數(shù),不會(huì)出現(xiàn)1.5
plt.xlabel("Number of components after dimension reduction")
plt.ylabel("Cumulative explained variance")
plt.show()
image

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

基于極大似然估計(jì)MLE的PCA

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

image

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

輸入0-1之間的浮點(diǎn)數(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)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,394評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380