【機器學習演算法實現】主成分分析(PCA)——基於python numpy
文章推薦指數: 80 %
【機器學習演算法實現】主成分分析(PCA)——基於python numpy. @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/42177327 ...
程式語言前端開發IOS開發Android開發雲端運算人工智慧伺服器搜尋資料庫軟體開發工具【機器學習演算法實現】主成分分析(PCA)——基於pythonnumpy2018.07.29程式語言《機器學習,machine-learning,pca,python,θ機器學習,機器學習,機器學習和,機器學習的HOME程式語言【機器學習演算法實現】主成分分析(PCA)——基於pythonnumpyAdvertisement目錄1.【機器學習演算法實現】主成分分析(PCA)——基於pythonnumpy1.1.1、PCA演算法介紹1.2.2、PCA演算法實現1.2.1.(1)零均值化1.2.2.(2)求協方差矩陣1.2.3.(3)求特徵值、特徵矩陣1.2.4.(4)保留主要的成分[即保留值比較大的前n個特徵]1.3.3、選擇主成分個數【機器學習演算法實現】主成分分析(PCA)——基於pythonnumpy@author:wepon@blog:http://blog.csdn.net/u012162613/article/details/421773271、PCA演算法介紹主成分分析(PrincipalComponentsAnalysis),簡稱PCA,是一種資料降維技術,用於資料預處理。
一般我們獲取的原始資料維度都很高,比如1000個特徵,在這1000個特徵中可能包含了很多無用的資訊或者噪聲,真正有用的特徵才100個,那麼我們可以運用PCA演算法將1000個特徵降到100個特徵。
這樣不僅可以去除無用的噪聲,還能減少很大的計算量。
PCA演算法是如何實現的?簡單來說,就是將資料從原始的空間中轉換到新的特徵空間中,例如原始的空間是三維的(x,y,z),x、y、z分別是原始空間的三個基,我們可以通過某種方法,用新的座標系(a,b,c)來表示原始的資料,那麼a、b、c就是新的基,它們組成新的特徵空間。
在新的特徵空間中,可能所有的資料在c上的投影都接近於0,即可以忽略,那麼我們就可以直接用(a,b)來表示資料,這樣資料就從三維的(x,y,z)降到了二維的(a,b)。
問題是如何求新的基(a,b,c)?一般步驟是這樣的:先對原始資料零均值化,然後求協方差矩陣,接著對協方差矩陣求特徵向量和特徵值,這些特徵向量組成了新的特徵空間。
具體的細節,推薦AndrewNg的網頁教程:Ufldl主成分分析 ,寫得很詳細。
2、PCA演算法實現語言:Python函式庫:Numpy>>>importnumpyasnp根據上面提到的一般步驟來實現PCA演算法(1)零均值化假如原始資料集為矩陣dataMat,dataMat中每一行代表一個樣本,每一列代表同一個特徵。
零均值化就是求每一列的平均值,然後該列上的所有數都減去這個均值。
也就是說,這裡零均值化是對每一個特徵而言的,零均值化都,每個特徵的均值變成0。
實現程式碼如下:defzeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0)#按列求均值,即求各個特徵的均值
newData=dataMat-meanVal
returnnewData,meanVal函式中用numpy中的mean方法來求均值,axis=0表示按列求均值。
該函式返回兩個變數,newData是零均值化後的資料,meanVal是每個特徵的均值,是給後面重構資料用的。
(2)求協方差矩陣newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)numpy中的cov函式用於求協方差矩陣,引數rowvar很重要!若rowvar=0,說明傳入的資料一行代表一個樣本,若非0,說明傳入的資料一列代表一個樣本。
因為newData每一行代表一個樣本,所以將rowvar設定為0。
covMat即所求的協方差矩陣。
(3)求特徵值、特徵矩陣呼叫numpy中的線性代數模組linalg中的eig函式,可以直接由covMat求得特徵值和特徵向量:eigVals,eigVects=np.linalg.eig(np.mat(covMat))eigVals存放特徵值,行向量。
eigVects存放特徵向量,每一列帶別一個特徵向量。
特徵值和特徵向量是一一對應的(4)保留主要的成分[即保留值比較大的前n個特徵]第三步得到了特徵值向量eigVals,假設裡面有m個特徵值,我們可以對其排序,排在前面的n個特徵值所對應的特徵向量就是我們要保留的,它們組成了新的特徵空間的一組基n_eigVect。
將零均值化後的資料乘以n_eigVect就可以得到降維後的資料。
程式碼如下:eigValIndice=np.argsort(eigVals)#對特徵值從小到大排序
n_eigValIndice=eigValIndice[-1:-(n1):-1]#最大的n個特徵值的下標
n_eigVect=eigVects[:,n_eigValIndice]#最大的n個特徵值對應的特徵向量
lowDDataMat=newData*n_eigVect#低維特徵空間的資料
reconMat=(lowDDataMat*n_eigVect.T)meanVal#重構資料
returnlowDDataMat,reconMat程式碼中有幾點要說明一下,首先argsort對特徵值是從小到大排序的,那麼最大的n個特徵值就排在後面,所以eigValIndice[-1:-(n1):-1]就取出這個n個特徵值對應的下標。
【python裡面,list[a:b:c]代表從下標a開始到b,步長為c。
】reconMat是重構的資料,乘以n_eigVect的轉置矩陣,再加上均值meanVal。
OK,這四步下來就可以從高維的資料dataMat得到低維的資料lowDDataMat,另外,程式也返回了重構資料reconMat,有些時候reconMat課便於資料分析。
貼一下總的程式碼:#零均值化
defzeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0)#按列求均值,即求各個特徵的均值
newData=dataMat-meanVal
returnnewData,meanVal
defpca(dataMat,n):
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)#求協方差矩陣,returnndarray;若rowvar非0,一列代表一個樣本,為0,一行代表一個樣本
eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特徵值和特徵向量,特徵向量是按列放的,即一列代表一個特徵向量
eigValIndice=np.argsort(eigVals)#對特徵值從小到大排序
n_eigValIndice=eigValIndice[-1:-(n1):-1]#最大的n個特徵值的下標
n_eigVect=eigVects[:,n_eigValIndice]#最大的n個特徵值對應的特徵向量
lowDDataMat=newData*n_eigVect#低維特徵空間的資料
reconMat=(lowDDataMat*n_eigVect.T)meanVal#重構資料
returnlowDDataMat,reconMat3、選擇主成分個數文章寫到這裡還沒有完,應用PCA的時候,對於一個1000維的資料,我們怎麼知道要降到幾維的資料才是合理的?即n要取多少,才能保留最多資訊同時去除最多的噪聲?一般,我們是通過方差百分比來確定n的,這一點在Ufldl教程中說得很清楚,並且有一條簡單的公式,下面是該公式的截圖:根據這條公式,可以寫個函式,函式傳入的引數是百分比percentage和特徵值向量,然後根據percentage確定n,程式碼如下:defpercentage2n(eigVals,percentage):
sortArray=np.sort(eigVals)#升序
sortArray=sortArray[-1::-1]#逆轉,即降序
arraySum=sum(sortArray)
tmpSum=0
num=0
foriinsortArray:
tmpSum=i
num=1
iftmpSum>=arraySum*percentage:
returnnum那麼pca函式也可以重寫成百分比版本,預設百分比99%。
defpca(dataMat,percentage=0.99):
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)#求協方差矩陣,returnndarray;若rowvar非0,一列代表一個樣本,為0,一行代表一個樣本
eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特徵值和特徵向量,特徵向量是按列放的,即一列代表一個特徵向量
n=percentage2n(eigVals,percentage)#要達到percent的方差百分比,需要前n個特徵向量
eigValIndice=np.argsort(eigVals)#對特徵值從小到大排序
n_eigValIndice=eigValIndice[-1:-(n1):-1]#最大的n個特徵值的下標
n_eigVect=eigVects[:,n_eigValIndice]#最大的n個特徵值對應的特徵向量
lowDDataMat=newData*n_eigVect#低維特徵空間的資料
reconMat=(lowDDataMat*n_eigVect.T)meanVal#重構資料
returnlowDDataMat,reconMatAdvertisement写评论取消回覆很抱歉,必須登入網站才能發佈留言。
近期文章Vue中容易被忽視的知識點2019.12.09if我是前端Leader,談談前端框架體系建設2019.12.09Spark入門(一)用SparkShell初嘗Spark滋味2019.12.08Spark入門(二)如何用Idea運行我們的Spark項目2019.12.08Spark入門(三)Spark經典的單詞統計2019.12.08Spark入門(四)Spark的map、flatMap、mapToPair2019.12.08Spark入門(五)Spark的reduce和reduceByKey2019.12.08Spark入門(六)Spark的combineByKey、sortBykey2019.12.08Spark入門(七)Spark的intersection、subtract、union和distinct2019.12.08Spark實戰尋找5億次訪問中,訪問次數最多的人2019.12.08AdvertisementAdvertisement
延伸文章資訊
- 1【機器學習演算法實現】主成分分析(PCA)——基於python numpy
【機器學習演算法實現】主成分分析(PCA)——基於python numpy. @author:wepon @blog:http://blog.csdn.net/u012162613/articl...
- 2主成分分析python, sklearn_天天向上的专栏 - CSDN博客
六月份似乎太忙,将近一个月没有写博客,于是挑一个多元统计分析中的方法写一篇python 操作实现的。主成分分析(Principle Component Analysis, ...
- 3主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)
下面使用python逐步完成葡萄酒的PCA案例。 2、提取主成分. 下載葡萄酒數據集wine.data到本地,或者到時在載入數據程式 ...
- 4python_主成分分析(PCA)降維- IT閱讀
python_主成分分析(PCA)降維 ... 主成分分析(principal component analysis)是一種常見的資料降維方法,其目的是在“資訊”損失較小的前提下,將高維的資料 ...
- 5Python实现主成分分析(PCA)降维:原理及实例分析 - CSDN ...
转载文章:Python实现主成分分析(PCA)降维:原理及实例分析简介降维是由一些问题带来的:可以缓解由维度诅咒(高维)带来的问题;可以用来压缩数据 ...