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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)

發(fā)布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(xué)習(xí)筆記

本篇博文絕大多數(shù)來源于書籍《機器學(xué)習(xí)實戰(zhàn)》
記錄自己的學(xué)習(xí)筆記而已。

降維作用
(1)使得數(shù)據(jù)集更容易使用
(2)降低很多算法的計算開銷
(3)去除噪聲
(4)多維數(shù)據(jù)不容易畫圖,降低維度容易畫圖,使結(jié)果容易理解。

優(yōu)點:降低數(shù)據(jù)的復(fù)雜性,識別出最重要的多個特征。
缺點:不一定需要,有可能損失掉有用信息,僅適用于數(shù)值數(shù)據(jù)。

PCA原理
在PCA中,數(shù)據(jù)從原來的坐標(biāo)系轉(zhuǎn)換到了新的坐標(biāo)系。新坐標(biāo)系的選擇是由數(shù)據(jù)本身決定的。第一個新坐標(biāo)軸選擇的是原始數(shù)據(jù)中方差最大的方向,第二個新坐標(biāo)軸的選擇和第一個坐標(biāo)軸正交且具有最大方差的方向。該過程一直重復(fù),重復(fù)次數(shù)為原始數(shù)據(jù)中特征的數(shù)目。會發(fā)現(xiàn),大部分方差都包含在最前面的幾個新坐標(biāo)軸中。因此我們可以只選擇前面幾個坐標(biāo)軸,即對數(shù)據(jù)進行了降維處理。(大白話講解:選擇坐標(biāo)軸的依據(jù)是盡可能保留原始數(shù)據(jù)。降維即把數(shù)據(jù)投影在這個坐標(biāo)軸上或者幾個坐標(biāo)軸構(gòu)成的‘平面’上)。

PCA相關(guān)算法
前面提到數(shù)據(jù)的第一個主成分是從數(shù)據(jù)差異最大(即方差最大)的方向提取出來。第二個主成分是數(shù)據(jù)差異性次大的方向,并且與第一個主成分正交。通過數(shù)據(jù)集的協(xié)方差矩陣及其特征值分析,我們就可以拿到這些主成分的值。
一旦得到協(xié)方差矩陣的特征向量,取出最大的N個值。這些特征向量也給出了N個最重要特征的真實結(jié)構(gòu)。將數(shù)據(jù)乘上這N個特征向量轉(zhuǎn)換到新的數(shù)據(jù)空間。
特征值分析
在 AV=aV中,V是特征向量,a是特征值,是簡單的標(biāo)量。等式的含義是:如何特征向量V被某個矩陣A左乘,那么它就等于某個標(biāo)量a乘以V。
numpy里有特征向量和特征值的模塊linalg。其中eig()方法用于求特征向量和特征值。

PCA原理實現(xiàn)

原始數(shù)據(jù).txt
數(shù)據(jù)為兩維,將其降維1維。
選用兩維是因為可以可視化。

代碼
python 3

import numpy as np import matplotlib.pyplot as plt""" 函數(shù)說明:解析文本數(shù)據(jù)Parameters: filename - 文件名 delim - 每一行不同特征數(shù)據(jù)之間的分隔方式,默認是tab鍵‘\t’Returns: j將float型數(shù)據(jù)值列表轉(zhuǎn)化為矩陣返回""" def loadDataSet(filename, delim='\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [list(map(float, line)) for line in stringArr]return np.mat(datArr)""" 函數(shù)說明:PCA特征維度壓縮函數(shù)Parameters: dataMat - 數(shù)據(jù)集數(shù)據(jù) topNfeat - 需要保留的特征維度,即要壓縮成的維度數(shù),默認4096Returns: lowDDataMat - 壓縮后的數(shù)據(jù)矩陣 reconMat - 壓縮后的數(shù)據(jù)矩陣反構(gòu)出原始數(shù)據(jù)矩陣""" def pca(dataMat, topNfeat=4096):# 求矩陣每一列的均值meanVals = np.mean(dataMat, axis=0)# 數(shù)據(jù)矩陣每一列特征減去該列特征均值meanRemoved = dataMat - meanVals# 計算協(xié)方差矩陣,處以n-1是為了得到協(xié)方差的無偏估計# cov(x, 0) = cov(x)除數(shù)是n-1(n為樣本個數(shù))# cov(x, 1)除數(shù)是ncovMat = np.cov(meanRemoved, rowvar=0)# 計算協(xié)方差矩陣的特征值及對應(yīng)的特征向量# 均保存在相應(yīng)的矩陣中eigVals, eigVects = np.linalg.eig(np.mat(covMat))# sort():對特征值矩陣排序(由小到大)# argsort():對特征矩陣進行由小到大排序,返回對應(yīng)排序后的索引eigValInd = np.argsort(eigVals)# 從排序后的矩陣最后一個開始自下而上選取最大的N個特征值,返回其對應(yīng)的索引eigValInd = eigValInd[: -(topNfeat+1): -1]# 將特征值最大的N個特征值對應(yīng)索引的特征向量提取出來,組成壓縮矩陣redEigVects = eigVects[:, eigValInd]# 將去除均值后的矩陣*壓縮矩陣,轉(zhuǎn)換到新的空間,使維度降低為NlowDDataMat = meanRemoved * redEigVects# 利用降維后的矩陣反構(gòu)出原數(shù)據(jù)矩陣(用作測試,可跟未壓縮的原矩陣比對)# 此處用轉(zhuǎn)置和逆的結(jié)果一樣redEigVects.IreconMat = (lowDDataMat * redEigVects.T) + meanValsprint(reconMat)# 返回壓縮后的數(shù)據(jù)矩陣及該矩陣反構(gòu)出原始數(shù)據(jù)矩陣return lowDDataMat, reconMatif __name__ == '__main__':dataMat = loadDataSet('數(shù)據(jù).txt')lowDmat, reconMat = pca(dataMat, 1)print(np.shape(lowDmat))fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:, 1].flatten().A[0], marker='^', s=90)ax.scatter(reconMat[:, 0].flatten().A[0], reconMat[:, 1].flatten().A[0], marker='o', s=90, c='red')plt.show()

lowDmat, reconMat 一個為降維后的數(shù)據(jù),一個為重構(gòu)后的數(shù)據(jù)。
(重構(gòu)為原來的數(shù)據(jù)格式,去除了一些噪聲)
在真實算例中,自己選擇要降維后的數(shù)據(jù)還是重構(gòu)數(shù)據(jù)。
如圖片數(shù)據(jù)pca后,肯定要選擇重構(gòu)數(shù)據(jù)。降維后的數(shù)據(jù)構(gòu)不成一張圖呀。

解釋:
PCA()里有兩個參數(shù),第一個參數(shù)為數(shù)據(jù)集,第二個參數(shù)為降的維度,降到多少維。
PCA偽代碼:
1.去除平均值: meanVals = np.mean(dataMat, axis=0)
2.計算協(xié)方差矩陣:covMat = np.cov(meanRemoved, rowvar=0)
3.計算協(xié)方差矩陣的特征值和特征向量:covMat = np.cov(meanRemoved, rowvar=0)
4.將特征值從大到小排序: eigValInd = np.argsort(eigVals)
# 從排序后的矩陣最后一個開始自下而上選取最大的N個特征值,返回其對應(yīng)的索引
eigValInd = eigValInd[: -(topNfeat+1): -1]
5.保留最上面的N個特征向量: # 將特征值最大的N個特征值對應(yīng)索引的特征向量提取出來,組成壓縮矩陣
redEigVects = eigVects[:, eigValInd]
6.將數(shù)據(jù)轉(zhuǎn)換到上述N個特征向量構(gòu)建的新空間中,根據(jù)公式重構(gòu)。(逆公式)

結(jié)果:
圖中紅色為重構(gòu)后的數(shù)據(jù)

PCA調(diào)包實現(xiàn)

導(dǎo)入包

from sklearn.decomposition import PCA

用法:

PCA()參數(shù)說明
n_componentsint, float, None 或 string,PCA算法中所要保留的主成分個數(shù),也即保留下來的特征個數(shù),如果 n_components = 1,將把原始數(shù)據(jù)降到一維;如果賦值為string,如n_components=‘mle’,將自動選取特征個數(shù),使得滿足所要求的方差百分比;如果沒有賦值,默認為None,特征個數(shù)不會改變(特征數(shù)據(jù)本身會改變)。
copyTrue 或False,默認為True,即是否需要將原始訓(xùn)練數(shù)據(jù)復(fù)制。
whiten:True 或False,默認為False,即是否白化,使得每個特征具有相同的方差。
屬性說明
explained_variance_ratio_返回所保留各個特征的方差百分比,如果n_components沒有賦值,則所有特征都會返回一個數(shù)值且解釋方差之和等于1。
n_components_:返回所保留的特征個數(shù)
方法說明
fit(X):用數(shù)據(jù)X來訓(xùn)練PCA模型。
fit_transform(X)用X來訓(xùn)練PCA模型,同時返回降維后的數(shù)據(jù)。
inverse_transform(newData)newData 為降維后的數(shù)據(jù)。將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù),但可能不會完全一樣,會有些許差別。
transform(X)將數(shù)據(jù)X轉(zhuǎn)換成降維后的數(shù)據(jù),當(dāng)模型訓(xùn)練好后,對于新輸入的數(shù)據(jù),也可以用transform方法來降維

例子:

import numpy as np import matplotlib.pyplot as plt#導(dǎo)入數(shù)據(jù) def loadDataSet(filename, delim='\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [list(map(float, line)) for line in stringArr]return np.mat(datArr) dataMat = loadDataSet('數(shù)據(jù).txt') #導(dǎo)入PCAfrom sklearn.decomposition import PCA pca = PCA(n_components=1) pca.fit(dataMat) lowDmat=pca.transform(dataMat)#降維后的數(shù)據(jù) print('降維后的數(shù)據(jù)維度:',lowDmat.shape) reconMat=pca.inverse_transform(lowDmat)#s重構(gòu)數(shù)據(jù) print("重構(gòu)后的數(shù)據(jù)維度:",reconMat.shape)#重構(gòu)數(shù)據(jù)維度fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:, 1].flatten().A[0], marker='^', s=90) ax.scatter(reconMat[:, 0], reconMat[:, 1], marker='o', s=90, c='red') plt.show()

注意:重構(gòu) 輸入的是降維后的數(shù)據(jù) reconMat=pca.inverse_transform(lowDmat)#s重構(gòu)數(shù)據(jù)
結(jié)果:

其他專業(yè)的計算機小白,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝!

總結(jié)

以上是生活随笔為你收集整理的PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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