日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维

發(fā)布時(shí)間:2025/3/8 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的基本想法如下:首先對需要降維的數(shù)據(jù)各個(gè)變量標(biāo)準(zhǔn)化(規(guī)范化)為均值為0、方差為1的數(shù)據(jù)集。然后對標(biāo)準(zhǔn)化后的數(shù)據(jù)進(jìn)行正交變換,將原來的數(shù)據(jù)轉(zhuǎn)換為若干個(gè)線性無關(guān)的向量表示的新數(shù)據(jù)。這些新向量表示的數(shù)據(jù)不僅要求相互線性無關(guān),而且需要是所包含的信息量最大。

? ? ?PCA使用方差來衡量新變量的信息量大小,按照方差大小排序依次為第一主成分、第二主成分等。下面對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ù)對求導(dǎo)并令為0可得:

? ? ?所以是的特征值,是對應(yīng)的單位特征向量。假設(shè)是的最大特征值對應(yīng)的單位特征向量,則和均為上述優(yōu)化問題的最優(yōu)解。所以為第一主成分,其方差為對應(yīng)協(xié)方差矩陣的最大特征值:

? ? ?同樣方法也可求第二主成分。但約束條件中需要加上與第一主成分不相關(guān)的約束,具體推導(dǎo)這里略過。按上述方法可一致計(jì)算到第個(gè)主成分,且第個(gè)主成分的方差等于的第個(gè)特征值:

假設(shè)原始數(shù)據(jù)為行列的數(shù)據(jù),梳理PCA的計(jì)算流程如下:

  • 對行列的數(shù)據(jù)按照列進(jìn)行均值為0方差為1的標(biāo)準(zhǔn)化;

  • 計(jì)算標(biāo)準(zhǔn)化后的的協(xié)方差矩陣;

  • 計(jì)算協(xié)方差矩陣的特征值和對應(yīng)的特征向量;

  • 將特征向量按對應(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é)方差矩陣的特征值和對應(yīng)特征向量eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)# 對特征值排序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ù)集為例看一下降維效果:

from sklearn import datasets import matplotlib.pyplot as plt import matplotlib.cm as cmx import matplotlib.colors as colors# 導(dǎo)入sklearn數(shù)據(jù)集 data = datasets.load_digits() X = data.data y = data.target# 將數(shù)據(jù)降維到2個(gè)主成分 X_trans = PCA().pca(X, 2) x1 = X_trans[:, 0] x2 = X_trans[:, 1]# 繪圖展示 cmap = plt.get_cmap('viridis') colors = [cmap(i) for i in np.linspace(0, 1, len(np.unique(y)))]class_distr = [] # 繪制不同類別分別 for i, l in enumerate(np.unique(y)):_x1 = x1[y == l]_x2 = x2[y == l]_y = y[y == l]class_distr.append(plt.scatter(_x1, _x2, color=colors[i]))# 圖例 plt.legend(class_distr, y, loc=1)# 坐標(biāo)軸 plt.suptitle("PCA Dimensionality Reduction") plt.title("Digit Dataset") plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.show();

參考資料:

統(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í)在線手冊深度學(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。加入微信群請掃碼進(jìn)群:

總結(jié)

以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。