西瓜書
第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í)矩陣分解
具有在線變分貝葉斯算法的隱含狄利克雷分布,LatenDirichletAllocation
非負(fù)矩陣分解,NMF
稀疏編碼,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
度之后變成了
0 | |
0 | |
0 |
的均值和方差都是
0
;的均值是
;方差是
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ù)的降維。
內(nèi)積和投影
內(nèi)積定義
兩個(gè)維度相同向量(機(jī)器學(xué)習(xí)中一般是指列向量)的內(nèi)積被定義成
內(nèi)積將兩個(gè)向量映射成為一個(gè)實(shí)數(shù)
內(nèi)積的幾何意義
image
,
為它們之前的夾角,投影的矢量長(zhǎng)度是
表示模,也就是A線段的標(biāo)量長(zhǎng)度。內(nèi)積的另一種表示形式為
也就是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í)際上表示為線性組合:
那么,(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)了。上面的基變成了,即除以了各自的模
。
那么(3,2)在這組基下的新坐標(biāo)為
筆記:一般情況基是正交的,就是說(shuō)內(nèi)積為0,直觀來(lái)說(shuō)是相互垂直的。
基變換的矩陣表示
矩陣的兩行表示兩個(gè)基,乘以原來(lái)的向量,得到新基下的坐標(biāo)。
一般的,如果我們有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è)元素與字段均值的差的平方和的均值
由于每個(gè)字段的均值變成了0,那么總的方差可以簡(jiǎn)寫成
筆記:將每個(gè)方差加起來(lái)再除以總樣本數(shù)m
協(xié)方差
數(shù)學(xué)上可以用兩個(gè)字段的協(xié)方差表示其相關(guān)性
當(dāng)均值為0,上面的協(xié)方差公式可以表示為
當(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é)方差矩陣是
- 對(duì)角線上是兩個(gè)字段的方差
- 其他元素是協(xié)方差
協(xié)方差矩陣對(duì)角化
- 除去對(duì)角線上的元素,其他全部變成0
- 對(duì)角線上的元素從大到小,從上往下排列
原始的協(xié)方差矩陣是C,P是一組基按行組成的矩陣,設(shè)Y=PX,Y對(duì)應(yīng)的協(xié)方差矩陣是D
由于C是一個(gè)對(duì)稱矩陣,滿足:
- 實(shí)對(duì)稱矩陣不同特征值對(duì)應(yīng)的特征向量必然正交
- 設(shè)特征向量
重?cái)?shù)為
r
,則必然存在r
個(gè)線性無(wú)關(guān)的特征向量對(duì)應(yīng)于,因此可以將
r
個(gè)特征向量單位正交化
e
代表的是單位向量,對(duì)于協(xié)方差矩陣C
的結(jié)論如下:
那么P是協(xié)方差矩陣的特征向量單位化后按行排列出的矩陣,
優(yōu)化目標(biāo)
- 選擇K個(gè)基之后最大程度地保留原有的信息
- K個(gè)基是單位正交基
- 原始數(shù)據(jù)映射到這組基上,各個(gè)字段之間的協(xié)方差為0,字段的總方差盡可能大。
解決方法:希望投影后的投影值盡量地分散。滿足的條件是:
- 最近重構(gòu)性:樣本點(diǎn)到投影平面(空間)的距離足夠近
- 最大可分性:樣本點(diǎn)在投影平面上的投影盡可能的分開
PCA算法
- 輸入:樣本集D和低維空間維度k
- 具體過程
- 所有樣本進(jìn)行去中心化
- 計(jì)算所有樣本的協(xié)方差矩陣
- 對(duì)協(xié)方差矩陣做特征值分解
- 取最大的k個(gè)特征值所對(duì)應(yīng)的特征向量
- 所有樣本進(jìn)行去中心化
- 輸出投影矩陣:
PCA實(shí)例
image
比較大,所以使用
作為基
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維的特征矩陣
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ù)
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()
降維之后數(shù)據(jù)的信息探索
主要是兩個(gè)屬性
累計(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()
結(jié)果表明選擇2個(gè)或者3個(gè)特征是比較好的
基于極大似然估計(jì)MLE的PCA
n_components
中不僅可以填寫數(shù)字,還可以通過極大似然估計(jì)MLE
來(lái)自選超參數(shù)
按照指定的信息占比選擇參數(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()