算法特點(diǎn)
非監(jiān)督機(jī)器學(xué)習(xí)算法贵试,主要用于數(shù)據(jù)降維;降維可以提高算法效率凯正,同時(shí)幫助可視化毙玻,以便于人類理解更好的理解數(shù)據(jù);去噪廊散。
1桑滩、 PCA的基本原理
樣本在其特征空間的分布表現(xiàn)是其各特征軸上記錄信息的綜合呈現(xiàn)形式。 PCA 分析基于能夠捕獲原始樣本最大信息量為目標(biāo)在樣本的原始特征空間尋找一個(gè)新的坐標(biāo)系允睹,并通過在新坐標(biāo)系中挑選能夠解釋樣本絕大部分信息的前個(gè)軸來描述樣本运准,從而完成數(shù)據(jù)的 降維。
1.1 二維空間的降維
對(duì)于包含二維特征的樣本集缭受,如果要將這個(gè)數(shù)據(jù)集從二維平面降到一維空間胁澳,通過在樣本的二維特征空間中尋找一條直線,將空間上的所有樣本點(diǎn) 向直線作投影米者,使得直線上的 投影點(diǎn)間距離相對(duì)較大同時(shí)擁有較高的區(qū)分度韭畸,從而在直線所代表的一維空間上,投影點(diǎn)的分布與原二維空間上樣本點(diǎn)的空間分布盡可能相似蔓搞,這條一維直線上的投影點(diǎn)就是二維空間樣本的降維結(jié)果胰丁。
在尋找空間中最優(yōu)的樣本投影直線過程中,樣本間距 由統(tǒng)計(jì)學(xué)中的描述 數(shù)據(jù)的離散程度(疏密) 的 方差(Variance) 所度量喂分;方差大樣本分布越稀疏锦庸,方差小樣本分布越緊密。所以最優(yōu)的投影軸的判斷條件即使得樣本空間的所有點(diǎn)映射到這條軸后蒲祈,方差最大甘萧。同時(shí),由于這條投影軸上的投影點(diǎn)分布具有最大方差梆掸,稱為 第一主成分幔嗦。
2、 PCA 降維操作的基本步驟
Step.1 將樣例 均值歸零(demean) 沥潭,邀泉;該過程不改變樣本分布。但樣例的方差計(jì)算將簡化為:
Step.2 在 demean 后的樣本空間中尋找一個(gè)方向?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=(w_1%2Cw_2)" alt="(w_1,w_2)" mathimg="1">的直線(除了方向,投影直線的大小以及偏移都不影響投影點(diǎn)間距汇恤,所以直接從中心化后的樣本空間坐標(biāo)原點(diǎn)確定直線的方向即可)庞钢,使得所有樣本映射到所在直線以后,投影點(diǎn)間方差最大:
這里由于樣例中心為原點(diǎn)因谎,所以
根據(jù) 向量投影 基括,結(jié)合方向向量 的模為 1可有
推廣到維樣本點(diǎn),展開為:
- Step.3 求解使得目標(biāo)函數(shù) 取最大值對(duì)應(yīng)的财岔,從而獲得最優(yōu)的投影坐標(biāo)軸风皿。其中使用搜索的方式 進(jìn)行求解的方案為 梯度上升法 。
目標(biāo):求匠璧,使得 最大桐款;
注意:PCA的 目標(biāo)函數(shù)形成的曲面 本身沒有極大值存在,直接使用梯度法求解的時(shí)候并不會(huì)收斂夷恍,這里前提是基于約束條件進(jìn)行的梯度法求解魔眨。所以這是一個(gè)帶約束的求極值問題。這個(gè)約束就是酿雪,的模要為1遏暴。PCA本身具有非常好的 數(shù)學(xué)解,梯度法搜索并不是最好的求解策略指黎,但可以用于理解PCA過程朋凉。
求關(guān)于每個(gè)維度的梯度(偏導(dǎo))
2.2 PCA與數(shù)據(jù)歸一化
- 歸一化 (Standar Scaler) 處理樣本的特征數(shù)據(jù),會(huì)非線性地改變數(shù)據(jù)的特征量綱醋安,從而進(jìn)行主成分分析時(shí)需要考慮實(shí)際需求選擇性進(jìn)行數(shù)據(jù)的歸一化侥啤。比如只是利用PCA對(duì)原始數(shù)據(jù)進(jìn)行降噪不降維的處理,則不能進(jìn)行歸一化的數(shù)據(jù)預(yù)處理茬故,只需要進(jìn)行數(shù)據(jù)平移(如 demean 操作)即可盖灸。
- 對(duì)于需要無偏差考量不同特征對(duì)樣本輸出標(biāo)記貢獻(xiàn)率的分析任務(wù),則需要注意樣本特征數(shù)量級(jí)帶來的方差影響影響(如一個(gè)特征的量綱從km更改為cm就會(huì)放大它的方差)磺芭,其中具有較大方差的特征將主導(dǎo)第一主成分的方差貢獻(xiàn)赁炎。因此對(duì)每個(gè)特征進(jìn)行歸一化后再進(jìn)行PCA降維處理才變得有意義(比如在聚類分析上,樣本的相似性度量就需要在同一尺度上來處理特征對(duì)樣本輸出標(biāo)記的影響)钾腺。更多討論請(qǐng)參考: normalization - Why do we need to normalize data before principal component analysis (PCA)? - Cross Validated (stackexchange.com)
2.3 梯度上升的簡單pyhton過程
import numpy as np
### Prepare dataset
X = np.empty((100,2))
X[:,0] = np.random.uniform(0.,100.,size = 100)
X[:,1] =0.75 * X[:,0] + np.random.normal(0.,10.,size = 100)
### 特征均值歸零
X = np.hstack([np.array(X[:,0] - np.mean(X[:,0])).reshape((-1,1)),np.array(X[:,1] - np.mean(X[:,1])).reshape((-1,1))])
### 目標(biāo)函數(shù)
def f(w,X):
return np.sum(X.dot(w)**2) / len(X)
### 梯度函數(shù)
def df(w,X):
return X.T.dot(X.dot(w)) *(2./len(X))
### 梯度上升求解過程
w = np.random.randint(10,size = X.shape[1])+ np.random.normal(size = X.shape[1]) ### 初始化參數(shù)集
w = w / np.linalg.norm(w) ### 約束w為單位向量
for cur_iter in range(int(1e4)):
last_w = w
w = w + .001 * df(w,X)
w = w / np.linalg.norm(w) ### 約束w為單位向量
if(abs(f(w,X) - f(last_w,X)) < 1e-8):break
print(w)
2.4 數(shù)據(jù)的前個(gè)主成分
PCA 工作的本質(zhì)是 對(duì)特征空間的坐標(biāo)軸重新排列徙垫,在樣本的原始特征空間內(nèi)尋找一套新的坐標(biāo)軸替換掉樣本的原始坐標(biāo)軸;在這套新的坐標(biāo)軸里放棒,第一主成分軸捕獲了樣本最大的方差姻报,第二主成分軸軸次之,第三主成分軸再次之间螟,以此類推吴旋;
所以损肛,對(duì)屬于維特征空間的樣本,如果僅僅找出包含它們投影最大方差的 第一主成分 軸()荣瑟,在該軸上的投影向量結(jié)果 并不是一維數(shù)據(jù)治拿, 依舊還是維向量,也就并沒有完成數(shù)據(jù)的降維笆焰。為了完成 降維 ,有必要繼續(xù)尋找其特征空間的其它個(gè)主成分劫谅。
在 第一主成分 的前提下,計(jì)算 第二組主成分嚷掠。
以 向量投影 一章的內(nèi)容作為鋪墊捏检。當(dāng) 樣本向量 向第一主成分軸 進(jìn)行投影后,在第一主成分軸上的 投影向量 僅包含了原樣本向量的部分信息不皆,其中未被捕獲的信息由 原樣本向量 在 投影向量垂直軸上 的 投影向量 所捕獲贯城。
因此,在求算 第二主成分 時(shí)粟焊,原始向量 需要先除去被第一主成分捕獲的信息冤狡,即將數(shù)據(jù)在第一主成分上的分量減掉; 然后對(duì)去掉第一主成分分量的原始樣本向量繼續(xù)找使得它們方差最大的投影直線孙蒙,這條直線所在的軸就是這組數(shù)據(jù)的 第二主成分项棠, 該過程就是 求PCA第一主成分過程的重復(fù)。
- 總結(jié)
- Step.1 去掉 第一主成分 分量 挎峦;
- Step.2 求新樣本向量的第一主成分香追;
- 求解第個(gè)主成分也是類似該過程的重復(fù).
def cur_component(X,w,eta,epsilon):
w = w / np.linalg.norm(w) ### 約束w為單位向量
for cur_iter in range(int(1e4)):
last_w = w
gradient = X.T.dot(X.dot(w)) *(2./len(X)) ### 求梯度
w = w + eta * gradient
w = w / np.linalg.norm(w)
target_f_0 = np.sum(X.dot(last_w)**2) / len(X) ### 目標(biāo)函數(shù)值,求方差
target_f_1 = np.sum(X.dot(w)**2) / len(X) ### 目標(biāo)函數(shù)值坦胶,求方差
if(abs(target_f_0 - target_f_1) < epsilon):break
return w
def n_components(n,X,eta = .01,n_iters = 1e4 , epsilon = 1e-8):
X_use = X.copy()
X_use = X_use - np.mean(X_use,axis=0) ### demean
res = [] ### 存儲(chǔ)每個(gè)主成分結(jié)果
for i in range(n):
initial_w = np.random.random(X_use.shape[1])
w = cur_component(X_use,initial_w,eta,epsilon) ### 計(jì)算當(dāng)前主成分
X_use = X_use - X_use.dot(w).reshape((-1,1))*w ### 除掉上一主成分上的分量
res.append(w)
return res
#### Prepare data
import numpy as np
X = np.empty((100,2))
X[:,0] = np.random.uniform(0.,100.,size = 100)
X[:,1] =0.75 * X[:,0] + np.random.normal(0.,10.,size = 100)
#### Test method
n_components(2,X)### 求前兩個(gè)主成分軸方向
2.5 高維數(shù)據(jù)向低維數(shù)據(jù)的映射
當(dāng)在樣本的維特征空間中透典,按 方差最大化 搜索了前個(gè)方向軸,使用這個(gè)軸來描述樣本分布完成數(shù)據(jù)的降維顿苇。
根據(jù)向量投影峭咒,它在投影軸上的 投影模長 () 就是它在投影軸上的分布,也就說是這是 向量對(duì)象 脫離原始空間在 投影軸生成空間 內(nèi)的描述坐標(biāo)纪岁。原始數(shù)據(jù)到個(gè)方向軸的映射(原始坐標(biāo)系到新坐標(biāo)系的轉(zhuǎn)換)為:
數(shù)據(jù)的維度恢復(fù)
數(shù)據(jù)維度恢復(fù)在數(shù)學(xué)運(yùn)算上雖然成立凑队。但是降維后的數(shù)據(jù),意味著原始數(shù)據(jù)發(fā)生了 信息丟失 幔翰,所以通過前個(gè)主成分來恢復(fù)到維的話漩氨,恢復(fù)出來的數(shù)據(jù)對(duì)象并不是降維前的對(duì)象.PCA降維與數(shù)據(jù)噪音
從噪音角度出發(fā),對(duì)于降維造成的 信息丟失 遗增,這部分丟失的信息存在于解釋方差比非常小的成分軸叫惊,這些丟失的信息很大一部分對(duì)于描述對(duì)象來說屬于 噪音。原始數(shù)據(jù)在測量過程中做修,由于儀器誤差霍狰、測量方法缺陷抡草、記錄錯(cuò)誤等因素,都會(huì)造成現(xiàn)實(shí)世界采集的數(shù)據(jù)存在噪音蚓耽。通過 PCA降維去除這些噪音渠牲,能有效提升樣本對(duì)象進(jìn)行識(shí)別分類回歸等分析時(shí)的準(zhǔn)確率。利用 維度恢復(fù) 方法將降維去噪后的數(shù)據(jù)對(duì)象恢復(fù)到原始維度之后步悠,相當(dāng)于在不損失數(shù)據(jù)特征數(shù)量的前提下對(duì)原始數(shù)據(jù)完成了 去噪 签杈。這在圖像識(shí)別處理上應(yīng)用較多。
3鼎兽、scikit-learn 框架內(nèi)封裝的PCA
from sklearn.decomposition import PCA
pca = PCA(n_components= 2) ### sklearn內(nèi)的pca算法為pca的正規(guī)數(shù)學(xué)解
pca.fit(X)
pca.components_ ### 主成分方向
pca.transform(X) ### 根據(jù)n_components降維
PCA的主成分軸方向向量(pca.components_
)內(nèi)各分量的大小代表了對(duì)應(yīng)特征對(duì)該主成分的 方差貢獻(xiàn)答姥,或者說該方向軸捕獲了方向軸向量內(nèi)最大分量對(duì)應(yīng)特征的最多信息。
3.2 獲取個(gè)主成分
方法屬性 : pca.explained_variance_ratio_
返回每個(gè)主成分所解釋 樣本總方差 的比例(特征空間內(nèi)樣本的總方差 為樣本各特征上的方差之和)谚咬。解釋方差比也可理解為捕獲的信息量鹦付。
初始化PCA方法對(duì)象時(shí)如果不指定參數(shù)輸入一個(gè)浮點(diǎn)數(shù)如 pca = PCA(0.95)
來表示降維后希望能夠保留下的 信息量,sklearn-pca 方法將挑選相應(yīng)主成分?jǐn)?shù)目進(jìn)行降維择卦。
pca = PCA(0.95)
pca.fit(X)
pca.transform(X)
pca.n_components_ ### 保留用于降維的主成分個(gè)數(shù)
3.3 數(shù)據(jù)集測試
### Prepare data
import numpy as np
from sklearn import datasets
digits = datasets.load_digits() ### 載入手寫數(shù)字?jǐn)?shù)據(jù)集
X = digits.data
y = digits.target
### test_train_split
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(X,y,test_size= 0.2,random_state=666)
###### scikit-learn PCA reducion #####
from sklearn.decomposition import PCA
pca = PCA(0.8) ### 降維到僅保留原始樣本80%信息
pca.fit(Train_X)
Train_X_reduc = pca.transform(Train_X) ### 根據(jù)n_components降維訓(xùn)練集
Test_X_reduc = pca.transform(Test_X ) ### 根據(jù)n_components降維測試集
print(pca.n_components_) ### 保留用于降維的主成分個(gè)數(shù)
###### scikit-learn kNN classifier #####
from sklearn.neighbors import KNeighborsClassifier
kNN_clf = KNeighborsClassifier(n_neighbors=3)
kNN_clf.fit(Train_X_reduc,Train_Y)
kNN_clf.score(Test_X_reduc,Test_Y) ### 預(yù)測準(zhǔn)確率
3.4 PCA 去噪
降噪不降維數(shù)學(xué)過程:
### Prepare dataset
import numpy as np
X = np.empty((100,2))
X[:,0] = np.random.uniform(0.,100.,size = 100)
X[:,1] = 0.75 * X[:,0] + np.random.normal(0.,4.,size = 100) ### 給y軸添加一個(gè)方差為4的正態(tài)噪音
###### scikit-learn PCA Noise reduction #####
from sklearn.decomposition import PCA
pca = PCA(.5) ### 降維到僅保留原始樣本50%信息
pca.fit(X)
X_reduc = pca.transform(X) ### 對(duì)原始矩陣進(jìn)行降維敲长,該過程伴隨維度降低和消除噪音
X_restore = pca.inverse_transform(X_reduc) ### 恢復(fù)降噪降維對(duì)象到原始對(duì)象的維度,從而達(dá)到僅降噪的效果