一,引言算法
降維是對數據高維度特徵的一種預處理方法。降維是將高維度的數據保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提高數據處理速度的目的。在實際的生產和應用中,降維在必定的信息損失範圍內,能夠爲咱們節省大量的時間和成本。降維也成爲了應用很是普遍的數據預處理方法。機器學習
降維具備以下一些優勢:函數
(1)使得數據集更易使用學習
(2)下降算法的計算開銷測試
(3)去除噪聲spa
(4)使得結果容易理解.net
PCA(principal Component Analysis),即主成分分析方法,是一種使用最普遍的數據壓縮算法。在PCA中,數據從原來的座標系轉換到新的座標系,由數據自己決定。轉換座標系時,以方差最大的方向做爲座標軸方向,由於數據的最大方差給出了數據的最重要的信息。第一個新座標軸選擇的是原始數據中方差最大的方法,第二個新座標軸選擇的是與第一個新座標軸正交且方差次大的方向。重複該過程,重複次數爲原始數據的特徵維數。調試
經過這種方式得到的新的座標系,咱們發現,大部分方差都包含在前面幾個座標軸中,後面的座標軸所含的方差幾乎爲0,。因而,咱們能夠忽略餘下的座標軸,只保留前面的幾個含有毫不部分方差的座標軸。事實上,這樣也就至關於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎爲0的特徵維度,也就實現了對數據特徵的降維處理。code
那麼,咱們如何獲得這些包含最大差別性的主成分方向呢?事實上,經過計算數據矩陣的協方差矩陣,而後獲得協方差矩陣的特徵值及特徵向量,選擇特徵值最大(也即包含方差最大)的N個特徵所對應的特徵向量組成的矩陣,咱們就能夠將數據矩陣轉換到新的空間當中,實現數據特徵的降維(N維)。blog
既然,說到了協方差矩陣,那麼這裏就簡單說一下方差和協方差之間的關係,首先看一下均值,方差和協方差的計算公式:
由上面的公式,咱們能夠獲得一下兩點區別:
(1)方差的計算公式,咱們知道方差的計算是針對一維特徵,即針對同一特徵不一樣樣本的取值來進行計算獲得;而協方差則必需要求至少知足二維特徵。能夠說方差就是協方差的特殊狀況。
(2)方差和協方差的除數是n-1,這樣是爲了獲得方差和協方差的無偏估計。具體推導過程能夠參見博文:http://blog.csdn.net/maoersong/article/details/21823397
二,PCA算法實現
將數據轉換爲只保留前N個主成分的特徵空間的僞代碼以下所示:
去除平均值
計算協方差矩陣
計算協方差矩陣的特徵值和特徵向量
將特徵值排序
保留前N個最大的特徵值對應的特徵向量
將數據轉換到上面獲得的N個特徵向量構建的新空間中(實現了特徵壓縮)
具體的代碼爲:
#導入numpy庫 from numpy import * #解析文本數據函數 #@filename 文件名txt #@delim 每一行不一樣特徵數據之間的分隔方式,默認是tab鍵'\t' def loadDataSet(filename,delim='\t') #打開文本文件 fr=open(filename) #對文本中每一行的特徵分隔開來,存入列表中,做爲列表的某一行 #行中的每一列對應各個分隔開的特徵 stringArr=[line.strip().split(delim) for line in fr.readlines()] #利用map()函數,將列表中每一行的數據值映射爲float型 datArr=[map(float.line)for line in stringArr] #將float型數據值的列表轉化爲矩陣返回 return mat(datArr) #pca特徵維度壓縮函數 #@dataMat 數據集矩陣 #@topNfeat 須要保留的特徵維度,即要壓縮成的維度數,默認4096 def pca(dataMat,topNfeat=4096): #求數據矩陣每一列的均值 meanVals=mean(dataMat,axis=0) #數據矩陣每一列特徵減去該列的特徵均值 meanRemoved=dataMat-meanVals #計算協方差矩陣,除數n-1是爲了獲得協方差的無偏估計 #cov(X,0) = cov(X) 除數是n-1(n爲樣本個數) #cov(X,1) 除數是n covMat=cov(meanRemoved,rowvar=0) #計算協方差矩陣的特徵值及對應的特徵向量 #均保存在相應的矩陣中 eigVals,eigVects=linalg.eig(mat(conMat)) #sort():對特徵值矩陣排序(由小到大) #argsort():對特徵值矩陣進行由小到大排序,返回對應排序後的索引 eigValInd=argsort(eigVals) #從排序後的矩陣最後一個開始自下而上選取最大的N個特徵值,返回其對應的索引 eigValInd=eigValInd[:-(topNfeat+1):-1] #將特徵值最大的N個特徵值對應索引的特徵向量提取出來,組成壓縮矩陣 redEigVects=eigVects[:,eigValInd] #將去除均值後的數據矩陣*壓縮矩陣,轉換到新的空間,使維度下降爲N lowDDataMat=meanRemoved*redEigVects #利用降維後的矩陣反構出原數據矩陣(用做測試,可跟未壓縮的原矩陣比對) reconMat=(lowDDataMat*redEigVects.T)+meanVals #返回壓縮後的數據矩陣即該矩陣反構出原始數據矩陣 return lowDDataMat,reconMat
上述降維過程,首先根據數據矩陣的協方差的特徵值和特徵向量,獲得最大的N個特徵值對應的特徵向量組成的矩陣,能夠稱之爲壓縮矩陣;獲得了壓縮矩陣以後,將去均值的數據矩陣乘以壓縮矩陣,就實現了將原始數據特徵轉化爲新的空間特徵,進而使數據特徵獲得了壓縮處理。
固然,咱們也能夠根據壓縮矩陣和特徵均值,反構獲得原始數據矩陣,經過這樣的方式能夠用於調試和驗證。
下圖是經過matplotlib將原始數據點(三角形點)和第一主成分點(圓形點)繪製出來的結果。顯然,第一主成分點佔據着數據最重要的信息。
import matplotlib import matplotlib.pyplot as plt fig=plt.figure() ax=fig.add_subplot(lll) #三角形表示原始數據點 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')
三,示例:PCA對半導體數據進行降維
咱們知道,像集成電路這樣的半導體,成本很是昂貴。若是能在製造過程當中儘早和儘快地檢測出是否出現瑕疵,將可能爲企業節省大量的成本和時間。那麼,咱們在面對大規模和高維度數據集時,顯然計算損耗會很大,無疑會很是耗時。因此,若是利用PCA等降維技術將高維的數據特徵進行降維處理,保留那些最重要的數據特徵,捨棄那些能夠忽略的特徵,將大大加快咱們的數據處理速度和計算損耗,爲企業節省不小的時間和成本。
1 數據缺失值的問題
顯然,數據集中可能會包含不少缺失值,這些缺失值是以NaN進行標識的。那麼如何對待這些缺失值呢?若是存在大量的樣本存在缺失值,顯然選擇將這些有缺失值得樣本丟棄不可取;此外,因爲並不知道這些值的意義,選擇將缺失值替換爲0也不是一個很好的決定。因此,這裏咱們選擇將數據集中的特徵缺失值,用數據集中該維度全部非NaN特徵的均值進行替換。相比之下,採用均值替換的方法在這裏是一個相對較好的選擇。
#缺失值處理函數 def replaceNaNWithMean(): #解析數據 datMat=loadDataSet('secom.data',' ') #獲取特徵維度 numFeat=shape(datMat)[1] #遍歷數據集每個維度 for i in range(numFeat): #利用該維度全部非NaN特徵求取均值 meanVal=mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #將該維度中全部NaN特徵所有用均值替換 datMat[nonzero(isnan(datMat[:,i].A))[0],i]=meanVal return datMat
這樣,咱們就去除了全部NaN特徵,接下來就能夠對數據集利用PCA算法進行降維處理了。
2 PCA降維
那麼咱們若是肯定須要保留哪些重要特徵呢?PCA函數能夠給出數據所包含的信息量,而後經過定量的計算數據中所包含的信息決定出保留特徵的比例。下面是具體代碼:
dataMat=pca.replaceNanWithMean() meanVals=mean(dataMat,axis=0) meanRemoved=dataMat-meanVals conMat=cov(meanRemoved,rowvar=0) eigVals,eigVects=linalg.eig(mat(covMat))
從上面的特徵值結果,咱們能夠看到以下幾個重要信息:
(1)裏面有不少值都是0,這意味着這些特徵都是其餘特徵的副本,均可以經過其餘特徵來表示,其自己沒有提供額外的信息。
(2)能夠看到最前面的15個特徵值得數量級都大於105,然後面的特徵值都變得很是小。這代表,全部特徵中只有部分特徵是重要特徵。
下圖示出了數據集前20個主成分佔總方差的百分比:
能夠看出,數據的絕大部分方差都包含在前面的幾個主成分中,捨棄後面的主成分並不會損失太多的信息。若是隻保留前面幾個最重要的主成分,那麼在保留了絕大部分信息的基礎上,能夠將數據集特徵壓縮到一個很是低的程度,顯然大大提升了計算效率。
下表是數據集前20個主成分所佔的總方差百分比,以及累計方差百分比:
由上表能夠看出,前六個主成分覆蓋了數據96.8%的方差,前二十個主成分覆蓋了99.3%的方差。這代表,經過特徵值分析,咱們能夠肯定出須要保留的主成分及其個數,在數據集總體信息(總方差)損失很小的狀況下,咱們能夠實現數據的大幅度降維。
一旦,經過特徵值分析知道了須要保留的主成分個數,那麼咱們就能夠經過pca函數,設定合適的N值,使得函數最終將數據特徵下降到最佳的維度。
四,總結
(1)降維是一種數據集預處理技術,每每在數據應用在其餘算法以前使用,它能夠去除掉數據的一些冗餘信息和噪聲,使數據變得更加簡單高效,提升其餘機器學習任務的計算效率。
(2)pca能夠從數據中識別主要特徵,經過將數據座標軸旋轉到數據角度上那些最重要的方向(方差最大);而後經過特徵值分析,肯定出須要保留的主成分個數,捨棄其餘主成分,從而實現數據的降維。