PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)
學習筆記
本篇博文絕大多數來源于書籍《機器學習實戰》
記錄自己的學習筆記而已。
降維作用
(1)使得數據集更容易使用
(2)降低很多算法的計算開銷
(3)去除噪聲
(4)多維數據不容易畫圖,降低維度容易畫圖,使結果容易理解。
優點:降低數據的復雜性,識別出最重要的多個特征。
缺點:不一定需要,有可能損失掉有用信息,僅適用于數值數據。
PCA原理
在PCA中,數據從原來的坐標系轉換到了新的坐標系。新坐標系的選擇是由數據本身決定的。第一個新坐標軸選擇的是原始數據中方差最大的方向,第二個新坐標軸的選擇和第一個坐標軸正交且具有最大方差的方向。該過程一直重復,重復次數為原始數據中特征的數目。會發現,大部分方差都包含在最前面的幾個新坐標軸中。因此我們可以只選擇前面幾個坐標軸,即對數據進行了降維處理。(大白話講解:選擇坐標軸的依據是盡可能保留原始數據。降維即把數據投影在這個坐標軸上或者幾個坐標軸構成的‘平面’上)。
PCA相關算法
前面提到數據的第一個主成分是從數據差異最大(即方差最大)的方向提取出來。第二個主成分是數據差異性次大的方向,并且與第一個主成分正交。通過數據集的協方差矩陣及其特征值分析,我們就可以拿到這些主成分的值。
一旦得到協方差矩陣的特征向量,取出最大的N個值。這些特征向量也給出了N個最重要特征的真實結構。將數據乘上這N個特征向量轉換到新的數據空間。
特征值分析
在 AV=aV中,V是特征向量,a是特征值,是簡單的標量。等式的含義是:如何特征向量V被某個矩陣A左乘,那么它就等于某個標量a乘以V。
numpy里有特征向量和特征值的模塊linalg。其中eig()方法用于求特征向量和特征值。
PCA原理實現
原始數據.txt
數據為兩維,將其降維1維。
選用兩維是因為可以可視化。
代碼
python 3
lowDmat, reconMat 一個為降維后的數據,一個為重構后的數據。
(重構為原來的數據格式,去除了一些噪聲)
在真實算例中,自己選擇要降維后的數據還是重構數據。
如圖片數據pca后,肯定要選擇重構數據。降維后的數據構不成一張圖呀。
解釋:
PCA()里有兩個參數,第一個參數為數據集,第二個參數為降的維度,降到多少維。
PCA偽代碼:
1.去除平均值: meanVals = np.mean(dataMat, axis=0)
2.計算協方差矩陣:covMat = np.cov(meanRemoved, rowvar=0)
3.計算協方差矩陣的特征值和特征向量:covMat = np.cov(meanRemoved, rowvar=0)
4.將特征值從大到小排序: eigValInd = np.argsort(eigVals)
# 從排序后的矩陣最后一個開始自下而上選取最大的N個特征值,返回其對應的索引
eigValInd = eigValInd[: -(topNfeat+1): -1]
5.保留最上面的N個特征向量: # 將特征值最大的N個特征值對應索引的特征向量提取出來,組成壓縮矩陣
redEigVects = eigVects[:, eigValInd]
6.將數據轉換到上述N個特征向量構建的新空間中,根據公式重構。(逆公式)
結果:
圖中紅色為重構后的數據
PCA調包實現
導入包
from sklearn.decomposition import PCA用法:
| n_components | int, float, None 或 string,PCA算法中所要保留的主成分個數,也即保留下來的特征個數,如果 n_components = 1,將把原始數據降到一維;如果賦值為string,如n_components=‘mle’,將自動選取特征個數,使得滿足所要求的方差百分比;如果沒有賦值,默認為None,特征個數不會改變(特征數據本身會改變)。 |
| copy | True 或False,默認為True,即是否需要將原始訓練數據復制。 |
| whiten: | True 或False,默認為False,即是否白化,使得每個特征具有相同的方差。 |
| explained_variance_ratio_ | 返回所保留各個特征的方差百分比,如果n_components沒有賦值,則所有特征都會返回一個數值且解釋方差之和等于1。 |
| n_components_: | 返回所保留的特征個數 |
| fit(X): | 用數據X來訓練PCA模型。 |
| fit_transform(X) | 用X來訓練PCA模型,同時返回降維后的數據。 |
| inverse_transform(newData) | newData 為降維后的數據。將降維后的數據轉換成原始數據,但可能不會完全一樣,會有些許差別。 |
| transform(X) | 將數據X轉換成降維后的數據,當模型訓練好后,對于新輸入的數據,也可以用transform方法來降維 |
例子:
import numpy as np import matplotlib.pyplot as plt#導入數據 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('數據.txt') #導入PCAfrom sklearn.decomposition import PCA pca = PCA(n_components=1) pca.fit(dataMat) lowDmat=pca.transform(dataMat)#降維后的數據 print('降維后的數據維度:',lowDmat.shape) reconMat=pca.inverse_transform(lowDmat)#s重構數據 print("重構后的數據維度:",reconMat.shape)#重構數據維度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()注意:重構 輸入的是降維后的數據 reconMat=pca.inverse_transform(lowDmat)#s重構數據
結果:
其他專業的計算機小白,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝!
總結
以上是生活随笔為你收集整理的PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华艺卫浴的五金龙头哪款比较好用一点?厨房
- 下一篇: 桂林银行app(桂林银行网上助手)