Python機(jī)器學(xué)習(xí)之PCA降維算法詳解
一、算法概述
- 主成分分析 (Principal ComponentAnalysis,PCA)是一種掌握事物主要矛盾的統(tǒng)計(jì)分析方法,它可以從多元事物中解析出主要影響因素,揭示事物的本質(zhì),簡化復(fù)雜的問題。
- PCA 是最常用的一種降維方法,它的目標(biāo)是通過某種線性投影,將高維的數(shù)據(jù)映射到低維的空間中,并期望在所投影的維度上數(shù)據(jù)的方差最大,以此使用較少的維度,同時(shí)保留較多原數(shù)據(jù)的維度。
- PCA 算法目標(biāo)是求出樣本數(shù)據(jù)協(xié)方差矩陣的特征值和特征向量,而協(xié)方差矩陣的特征向量的方向就是PCA需要投影的方向。使樣本數(shù)據(jù)向低維投影后,能盡可能表征原始的數(shù)據(jù)。
- PCA 可以把具有相關(guān)性的高維變量合成為線性無關(guān)的低維變量,稱為主成分。主成分能夠盡可能的保留原始數(shù)據(jù)的信息。
- PCA 通常用于高維數(shù)據(jù)集的探索與可視化,還可以用作數(shù)據(jù)壓縮和預(yù)處理等。
二、算法步驟
1.將原始數(shù)據(jù)按行組成m行n列的矩陣X
2.將X的每一列(代表一個(gè)屬性字段)進(jìn)行零均值化,即減去這一列的均值
3.求出協(xié)方差矩陣
4.求出協(xié)方差矩陣的特征值及對應(yīng)的特征向量r
5.將特征向量按對應(yīng)特征值大小從左到右按列排列成矩陣,取前k列組成矩陣P
6.計(jì)算降維到k維的數(shù)據(jù)
三、相關(guān)概念
方差
:描述一個(gè)數(shù)據(jù)的離散程度
協(xié)方差
:描述兩個(gè)數(shù)據(jù)的相關(guān)性,接近1就是正相關(guān),接近-1就是負(fù)相關(guān),接近0就是不相關(guān)
協(xié)方差矩陣
:協(xié)方差矩陣是一個(gè)對稱的矩陣,而且對角線是各個(gè)維度的方差
特征值
:用于選取降維的K個(gè)特征值特征向量
:用于選取降維的K個(gè)特征向量
四、算法優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 僅僅需要以方差衡量信息量,不受數(shù)據(jù)集以外的因素影響。
- 各主成分之間正交,可消除原始數(shù)據(jù)成分間的相互影響的因素。
- 計(jì)算方法簡單,主要運(yùn)算是特征值分解,易于實(shí)現(xiàn)。
缺點(diǎn)
- 主成分各個(gè)特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強(qiáng)。
- 方差小的非主成分也可能含有對樣本差異的重要信息,降維丟棄的數(shù)據(jù)可能對后續(xù)數(shù)據(jù)處理有影響。
五、算法實(shí)現(xiàn)
自定義實(shí)現(xiàn)
import numpy as np # 對初始數(shù)據(jù)進(jìn)行零均值化處理 def zeroMean(dataMat): # 求列均值 meanVal = np.mean(dataMat, axis=0) # 求列差值 newData = dataMat - meanVal return newData, meanVal # 對初始數(shù)據(jù)進(jìn)行降維處理 def pca(dataMat, percent=0.19): newData, meanVal = zeroMean(dataMat) # 求協(xié)方差矩陣 covMat = np.cov(newData, rowvar=0) # 求特征值和特征向量 eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 抽取前n個(gè)特征向量 n = percentage2n(eigVals, percent) print("數(shù)據(jù)降低到:" + str(n) + '維') # 將特征值按從小到大排序 eigValIndice = np.argsort(eigVals) # 取最大的n個(gè)特征值的下標(biāo) n_eigValIndice = eigValIndice[-1:-(n + 1):-1] # 取最大的n個(gè)特征值的特征向量 n_eigVect = eigVects[:, n_eigValIndice] # 取得降低到n維的數(shù)據(jù) lowDataMat = newData * n_eigVect reconMat = (lowDataMat * n_eigVect.T) + meanVal return reconMat, lowDataMat, n # 通過方差百分比確定抽取的特征向量的個(gè)數(shù) def percentage2n(eigVals, percentage): # 按降序排序 sortArray = np.sort(eigVals)[-1::-1] # 求和 arraySum = sum(sortArray) tempSum = 0 num = 0 for i in sortArray: tempSum += i num += 1 if tempSum >= arraySum * percentage: return num if __name__ == '__main__': # 初始化原始數(shù)據(jù)(行代表樣本,列代表維度) data = np.random.randint(1, 20, size=(6, 8)) print(data) # 對數(shù)據(jù)降維處理 fin = pca(data, 0.9) mat = fin[1] print(mat)
利用Sklearn庫實(shí)現(xiàn)
import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets import load_iris # 加載數(shù)據(jù) data = load_iris() x = data.data y = data.target # 設(shè)置數(shù)據(jù)集要降低的維度 pca = PCA(n_components=2) # 進(jìn)行數(shù)據(jù)降維 reduced_x = pca.fit_transform(x) red_x, red_y = [], [] green_x, green_y = [], [] blue_x, blue_y = [], [] # 對數(shù)據(jù)集進(jìn)行分類 for i in range(len(reduced_x)): if y[i] == 0: red_x.append(reduced_x[i][0]) red_y.append(reduced_x[i][1]) elif y[i] == 1: green_x.append(reduced_x[i][0]) green_y.append(reduced_x[i][1]) else: blue_x.append(reduced_x[i][0]) blue_y.append(reduced_x[i][1]) plt.scatter(red_x, red_y, c='r', marker='x') plt.scatter(green_x, green_y, c='g', marker='D') plt.scatter(blue_x, blue_y, c='b', marker='.') plt.show()
六、算法優(yōu)化
PCA是一種線性特征提取算法,通過計(jì)算將一組特征按重要性從小到大重新排列得到一組互不相關(guān)的新特征,但該算法在構(gòu)造子集的過程中采用等權(quán)重的方式,忽略了不同屬性對分類的貢獻(xiàn)是不同的。
KPCA算法
KPCA是一種改進(jìn)的PCA非線性降維算法,它利用核函數(shù)的思想,把樣本數(shù)據(jù)進(jìn)行非線性變換,然后在變換空間進(jìn)行PCA,這樣就實(shí)現(xiàn)了非線性PCA。
局部PCA算法
局部PCA是一種改進(jìn)的PCA局部降維算法,它在尋找主成分時(shí)加入一項(xiàng)具有局部光滑性的正則項(xiàng),從而使主成分保留更多的局部性信息。
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)之PCA降維算法詳解的文章就介紹到這了,更多相關(guān)Python PCA降維算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python遠(yuǎn)程創(chuàng)建docker容器的方法
這篇文章主要介紹了Python遠(yuǎn)程創(chuàng)建docker容器的方法,如果docker??ps找不到該容器,可以使用?docker?ps?-a查看所有的,然后看剛才創(chuàng)建的容器的STATUS是EXIT0還是EXIT1如果是1,那應(yīng)該是有報(bào)錯(cuò),使用?docker?logs?容器id命令來查看日志,根據(jù)日志進(jìn)行解決,需要的朋友可以參考下2024-04-04Python?OpenCV實(shí)現(xiàn)圖像增強(qiáng)操作詳解
由于很多不確定因素,導(dǎo)致圖像采集的光環(huán)境極其復(fù)雜;為了提高目標(biāo)檢測模型的泛化能力,本文將使用python中的opencv模塊實(shí)現(xiàn)常見的圖像增強(qiáng)方法,感興趣的可以了解一下2022-10-10Python使用matplotlib實(shí)現(xiàn)繪制自定義圖形功能示例
這篇文章主要介紹了Python使用matplotlib實(shí)現(xiàn)繪制自定義圖形功能,結(jié)合實(shí)例形式分析了Python基于matplotlib模塊實(shí)現(xiàn)自定義圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-01-01教你用Python創(chuàng)建微信聊天機(jī)器人
這篇文章主要手把手教你用Python創(chuàng)建微信聊天機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03OpenCV圖像識別之姿態(tài)估計(jì)Pose?Estimation學(xué)習(xí)
這篇文章主要為大家介紹了OpenCV圖像識別之姿態(tài)估計(jì)Pose?Estimation學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例
今天小編就為大家分享一篇pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Python實(shí)現(xiàn)快速傅里葉變換的方法(FFT)
這篇文章主要介紹了Python實(shí)現(xiàn)快速傅里葉變換的方法(FFT),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07