PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)
學(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
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用法:
| n_components | int, float, None 或 string,PCA算法中所要保留的主成分個數(shù),也即保留下來的特征個數(shù),如果 n_components = 1,將把原始數(shù)據(jù)降到一維;如果賦值為string,如n_components=‘mle’,將自動選取特征個數(shù),使得滿足所要求的方差百分比;如果沒有賦值,默認為None,特征個數(shù)不會改變(特征數(shù)據(jù)本身會改變)。 |
| copy | True 或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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华艺卫浴的五金龙头哪款比较好用一点?厨房
- 下一篇: 桂林银行app(桂林银行网上助手)