【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维
Python機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)
Author:louwill
Machine Learning Lab
? ? ?
? ? ?作為一種常見的多元統(tǒng)計(jì)分析方法,主成分分析法(Principal Component Analysis,PCA)也是一種經(jīng)典的無監(jiān)督學(xué)習(xí)算法。PCA通過正交變換將一組由線性相關(guān)變量表示的數(shù)據(jù)轉(zhuǎn)換為少數(shù)幾個(gè)由線性無關(guān)變量表示的數(shù)據(jù),這幾個(gè)線性無關(guān)的變量就是主成分。PCA通過將高維數(shù)據(jù)維度減少到少數(shù)幾個(gè)維度,本質(zhì)上屬于一種數(shù)據(jù)降維方法,也可以用來探索數(shù)據(jù)的內(nèi)在結(jié)構(gòu)。
PCA原理與推導(dǎo)
? ? ?PCA的基本想法如下:首先對(duì)需要降維的數(shù)據(jù)各個(gè)變量標(biāo)準(zhǔn)化(規(guī)范化)為均值為0、方差為1的數(shù)據(jù)集。然后對(duì)標(biāo)準(zhǔn)化后的數(shù)據(jù)進(jìn)行正交變換,將原來的數(shù)據(jù)轉(zhuǎn)換為若干個(gè)線性無關(guān)的向量表示的新數(shù)據(jù)。這些新向量表示的數(shù)據(jù)不僅要求相互線性無關(guān),而且需要是所包含的信息量最大。
? ? ?PCA使用方差來衡量新變量的信息量大小,按照方差大小排序依次為第一主成分、第二主成分等。下面對(duì)PCA原理進(jìn)行簡單推導(dǎo)。假設(shè)原始數(shù)據(jù)為維隨機(jī)變量,其均值向量為:
? ? ?其協(xié)方差矩陣為:
? ? ?現(xiàn)假設(shè)由維隨機(jī)變量到維隨機(jī)變量的線性變換:
其中。
? ? ?然后可得變換后的隨機(jī)變量的統(tǒng)計(jì)特征:
? ? ? 當(dāng)上述線性變換滿足如下條件時(shí),變換后的分別為的第一主成分、第二主成分以及第主成分。
變換的系數(shù)向量為單位向量,有。
變換后的變量與線性無關(guān),即。
變量是所有線性變換中方差最大的,是與不相關(guān)的所有線性變換中方差最大的。
? ? ?以上條件給出了求解PCA主成分的方法。根據(jù)約束條件和優(yōu)化目標(biāo),我們可以使用拉格朗日乘子法來求出主成分。先來求解第一主成分。
? ? ?根據(jù)前述條件,我們可以形式化第一主成分的數(shù)學(xué)表達(dá)為:
定義拉格朗日函數(shù):
將上述拉格朗日函數(shù)對(duì)求導(dǎo)并令為0可得:
? ? ?所以是的特征值,是對(duì)應(yīng)的單位特征向量。假設(shè)是的最大特征值對(duì)應(yīng)的單位特征向量,則和均為上述優(yōu)化問題的最優(yōu)解。所以為第一主成分,其方差為對(duì)應(yīng)協(xié)方差矩陣的最大特征值:
? ? ?同樣方法也可求第二主成分。但約束條件中需要加上與第一主成分不相關(guān)的約束,具體推導(dǎo)這里略過。按上述方法可一致計(jì)算到第個(gè)主成分,且第個(gè)主成分的方差等于的第個(gè)特征值:
假設(shè)原始數(shù)據(jù)為行列的數(shù)據(jù),梳理PCA的計(jì)算流程如下:
對(duì)行列的數(shù)據(jù)按照列進(jìn)行均值為0方差為1的標(biāo)準(zhǔn)化;
計(jì)算標(biāo)準(zhǔn)化后的的協(xié)方差矩陣;
計(jì)算協(xié)方差矩陣的特征值和對(duì)應(yīng)的特征向量;
將特征向量按對(duì)應(yīng)特征值大小從上到下按行排列成矩陣,取前行構(gòu)成的矩陣;
即為PCA降維后的維數(shù)據(jù)。
PCA的numpy實(shí)現(xiàn)
? ? ?雖然sklearn中提供了PCA降維的API,但其背后算法是用SVD來實(shí)現(xiàn)的。numpy模塊下提供了強(qiáng)大的矩陣運(yùn)算函數(shù),下面我們用numpy來實(shí)現(xiàn)一個(gè)PCA算法。
import numpy as npclass PCA():# 計(jì)算協(xié)方差矩陣def calculate_covariance_matrix(self, X):m = X.shape[0]# 數(shù)據(jù)標(biāo)準(zhǔn)化X = X - np.mean(X, axis=0)return 1 / m * np.matmul(X.T, X)def pca(self, X, n_components):# 計(jì)算協(xié)方差矩陣covariance_matrix = self.calculate_covariance_matrix(X)# 計(jì)算協(xié)方差矩陣的特征值和對(duì)應(yīng)特征向量eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)# 對(duì)特征值排序idx = eigenvalues.argsort()[::-1]# 取最大的前n_component組eigenvectors = eigenvectors[:, idx]eigenvectors = eigenvectors[:, :n_components]# Y=PX轉(zhuǎn)換return np.matmul(X, eigenvectors)? ? ?由上述代碼可以看到,基于numpy我們僅需要數(shù)行核心代碼即可實(shí)現(xiàn)一個(gè)PCA降維算法。下面以sklearn digits數(shù)據(jù)集為例看一下降維效果:
參考資料:
統(tǒng)計(jì)學(xué)習(xí)方法第二版
多元統(tǒng)計(jì)分析 何曉群
https://github.com/RRdmlearning/Machine-Learning-From-Scratch
往期精彩:
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法18:奇異值分解SVD
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法17:XGBoost
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法16:Adaboost
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法15:GBDT
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法14:Ridge嶺回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法13:Lasso回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法12:貝葉斯網(wǎng)絡(luò)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法11:樸素貝葉斯
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法10:線性不可分支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法8-9:線性可分支持向量機(jī)和線性支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法7:神經(jīng)網(wǎng)絡(luò)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法6:感知機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法5:決策樹之CART算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法4:決策樹之ID3算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法3:k近鄰
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法2:邏輯回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法1:線性回歸
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】告别枯燥,60 秒
- 下一篇: 【NLP】NLP实战篇之tensorfl