PCA简化数据
1. 降維
在已標(biāo)注與未標(biāo)注的數(shù)據(jù)上都有降維技術(shù)。這里我們將主要關(guān)注未標(biāo)注數(shù)據(jù)上的降維技術(shù),該技術(shù)同時(shí)也可以應(yīng)用于已標(biāo)注的數(shù)據(jù)
- 主成分分析(Principal Component Analysis,PCA):
將數(shù)據(jù)從原來(lái)的坐標(biāo)系轉(zhuǎn)移到新的坐標(biāo)系,新坐標(biāo)系的選擇由數(shù)據(jù)本身決定,新坐標(biāo)系的第一個(gè)坐標(biāo)軸是原始數(shù)據(jù)中方差最大的方向,新坐標(biāo)系的第二個(gè)坐標(biāo)軸和第一個(gè)坐標(biāo)軸正交、并且具有最大方差。該過(guò)程一直重復(fù),次數(shù)為原始數(shù)據(jù)中維度。大部分方差都包含在前面幾個(gè)新坐標(biāo)軸中,因此可以忽略剩下的坐標(biāo)軸,即對(duì)數(shù)據(jù)進(jìn)行了降維處理。 - 因子分析(Factor Analysis):
假設(shè)觀察數(shù)據(jù)的生成中有一些觀察不到的隱變量,即觀察數(shù)據(jù)是由這些隱變量和某些噪聲的線性組合,那么隱變量的數(shù)據(jù)可能比觀察數(shù)據(jù)的數(shù)目少,找到隱變量就可以實(shí)現(xiàn)數(shù)據(jù)的降維。 - 獨(dú)立成分分析(Independent Component Analysis,ICA):
假設(shè)數(shù)據(jù)從N個(gè)數(shù)據(jù)源生成,類(lèi)似因子分析,假設(shè)這些數(shù)據(jù)源之間在統(tǒng)計(jì)上相互獨(dú)立,如果數(shù)據(jù)源數(shù)目少于觀察數(shù)據(jù)數(shù)目,就實(shí)現(xiàn)降維過(guò)程。
-獨(dú)立成分分析(Independent Component Analysis,ICA):
ICA假設(shè)數(shù)據(jù)是從N個(gè)數(shù)據(jù)源生成的,這一點(diǎn)和因子分析有些類(lèi)似。假設(shè)數(shù)據(jù)為多個(gè)數(shù)據(jù)源的混合觀察結(jié)果,這些數(shù)據(jù)源之間在統(tǒng)計(jì)上是相互獨(dú)立的,而在PCA中只假設(shè)數(shù)據(jù)是不相關(guān)的。同因子分析一樣,如果數(shù)據(jù)源的數(shù)目少于觀察數(shù)據(jù)的數(shù)目,則可以實(shí)現(xiàn)降維過(guò)程。
在上述3種降維技術(shù)中,PCA的應(yīng)用目前最為廣泛。
2. PCA
2.1 理論知識(shí)
在正交屬性空間中的樣本點(diǎn),可以用一個(gè)超平面對(duì)所有的樣本進(jìn)行一個(gè)合適的表達(dá),而這個(gè)超平面應(yīng)該具有如下的性質(zhì):
- 最近重構(gòu)性:樣本點(diǎn)到這個(gè)超平面的距離足夠近
- 最大可分性:樣本點(diǎn)到這個(gè)超平面的投影盡可能分開(kāi)
基于最近重構(gòu)性和最大可分性,能分別得到主成分分析的兩種推到:
(1)最近重構(gòu)性
- 首先對(duì)數(shù)據(jù)進(jìn)行中心化,即∑ixi=0
- 再假定投影變換后得到的坐標(biāo)為w1,w2,......wd,其中wi是標(biāo)準(zhǔn)正交基向量,即||wi||2=1,wTiwj=0(i≠j)
- 這時(shí)如果丟棄新坐標(biāo)系中的部分坐標(biāo),即把維度降低到d′<d,就達(dá)到了降維的目的,此時(shí)樣本在低維中的投影是zi=(zi1,zi2.......zid′),其中zij=wTjxi是xi在低維坐標(biāo)系下第j維的坐標(biāo),現(xiàn)在基于投影的點(diǎn)重構(gòu)原樣本點(diǎn)得到:xi^=∑d′j=1zijwj?
則此時(shí)對(duì)整個(gè)訓(xùn)練集要計(jì)算原樣本點(diǎn)xi與基于投影得到的樣本點(diǎn)xi^之間的距離:
=>?tr(WT(∑i=1mxixTi)W)
所以根據(jù)最近重構(gòu)性,上面的式子應(yīng)被最小化,同時(shí) wj是標(biāo)準(zhǔn)正交基, ∑mi=1xixTi是協(xié)方差矩陣,有
minws.t?tr(WTXXTW)WTW=1
這就是主成分分析的優(yōu)化目標(biāo)。
(2)最大可分性
我們知道樣本點(diǎn)xi在新空間中超平面的投影是WTxi,此時(shí),要想讓所有的樣本的投影盡可能的分開(kāi),就要使投影后樣本點(diǎn)的方差最大化,如下圖:
投影后樣本點(diǎn)的方差是∑iWTxixTiW,于是優(yōu)化目標(biāo)為:
可以看出兩個(gè)優(yōu)化目標(biāo)都要使用拉格朗日乘子法可得:
XXTW=λW
其中 λ是特征值,于是可知只需對(duì)協(xié)方差矩陣 XXT進(jìn)行特征值分解,將求得的特征值排序,然后取前n個(gè)特征值對(duì)應(yīng)的特征向量構(gòu)成 W=(w1,w2,.......wn),這就是主成分分析的解。
注意:
PCA也可看作是逐一選取方差最大的方向,即先對(duì)協(xié)方差矩陣∑ixixTi做特征值分解,取最大特征值對(duì)應(yīng)的特征向量w1,再對(duì)∑ixixTi?λ1w1wT1做特征分解,取最大特征值對(duì)應(yīng)的特征向量w2,。。。理論可以證明上述逐一選取方差最大方向的做法和直接選取最大n個(gè)特征值等價(jià)。
2.2 移動(dòng)坐標(biāo)軸
- 面對(duì)二維圖上的大量數(shù)據(jù)點(diǎn),如果要求我們畫(huà)出一條直線,這條線要盡可能覆蓋這些點(diǎn),那么最長(zhǎng)的線可能是哪條?那肯定是B這條直線最長(zhǎng),在PCA中,我們對(duì)數(shù)據(jù)的坐標(biāo)進(jìn)行了旋轉(zhuǎn),該旋轉(zhuǎn)的過(guò)程取決于數(shù)據(jù)的本身。B坐標(biāo)軸旋轉(zhuǎn)到覆蓋數(shù)據(jù)的最大的方差位置,數(shù)據(jù)的最大方差給出了數(shù)據(jù)的最重要的信息。在選擇了覆蓋數(shù)據(jù)最大差異性的坐標(biāo)軸之后,我們選擇了第二條坐標(biāo)軸。也就是正交的那條坐標(biāo)軸。當(dāng)然,在二維平面下,垂直和正交是一回事。利用PCA我們將數(shù)據(jù)坐標(biāo)軸旋轉(zhuǎn)至數(shù)據(jù)角度上的那些最重要的方向。
- 如果實(shí)現(xiàn)了坐標(biāo)軸的旋轉(zhuǎn),那么接下來(lái)就是降維。其實(shí)坐標(biāo)軸的旋轉(zhuǎn)并沒(méi)有減少數(shù)據(jù)的維度。通過(guò)PCA進(jìn)行降維處理,我們就可以同時(shí)獲得SVM和決策樹(shù)的優(yōu)點(diǎn):一方面,得到了和決策樹(shù)一樣簡(jiǎn)單的分類(lèi)器,同時(shí)分類(lèi)間隔和SVM—樣好。
示例:
上圖中的數(shù)據(jù)來(lái)自于未經(jīng)PCA處理的數(shù)據(jù)經(jīng)PCA轉(zhuǎn)換之后繪制而成的,如果僅使用原始數(shù)據(jù),那么這里的間隔會(huì)比決策樹(shù)的間隔更大。另外,由于只需要考慮一維信息,因此數(shù)據(jù)就可以通過(guò)比SVM簡(jiǎn)單得多的很容易采用的規(guī)則進(jìn)行區(qū)分,這其實(shí)就是PCA的主要作用。
前面提到的第一個(gè)主成分就是從數(shù)據(jù)差異性最大(即方差最大)的方向提取出來(lái)的,第二個(gè)主成分則來(lái)自于數(shù)據(jù)差異性次大的方向,并且該方向與第一個(gè)主成分方向正交。通過(guò)數(shù)據(jù)集的協(xié)方差矩陣及其特征值分析,我們就可以求得這些主成分的值。一旦得到了協(xié)方差矩陣的特征向量,我們就可以保留最大的外個(gè)值。這些特征向量也給出了N個(gè)最重要特征的真實(shí)結(jié)構(gòu)。我們可以通過(guò)將數(shù)據(jù)乘上這N個(gè)特征向量而將它轉(zhuǎn)換到新的空間。
2.3 PCA
將數(shù)據(jù)轉(zhuǎn)換成前N個(gè)主成分的偽碼大致如下:
去除平均值
計(jì)算協(xié)方差矩陣
計(jì)算協(xié)方差矩陣的特征值和特征向量
將特征值從大到小排序
保留最上面的N個(gè)特征向量
將數(shù)據(jù)轉(zhuǎn)換到上述N個(gè)特征向量構(gòu)建的新空間中
提前的數(shù)據(jù)處理:中心化和標(biāo)準(zhǔn)化
PCA代碼:
# -*- coding: utf-8 -*- """ Spyder Editor """ from numpy import * import matplotlib import matplotlib.pyplot as pltdef loadDataSet(fileName, delim='\t'):fr = open(fileName)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [map(float,line) for line in stringArr] return mat(datArr) # 返回矩陣# PCA算法 def pca(dataMat, topNfeat=9999999): # topNfeat是應(yīng)用的99999999個(gè)特征meanVals = mean(dataMat, axis=0) # 求平均值(按每一列)meanRemoved = dataMat - meanVals covMat = cov(meanRemoved, rowvar=0) # 計(jì)算協(xié)方差矩陣eigVals,eigVects = linalg.eig(mat(covMat)) # 得到特征值和特征向量#print 'eigVals,eigVects:',eigVals,eigVectseigValInd = argsort(eigVals) # 特征值從小到大排序時(shí)的下標(biāo)值eigValInd = eigValInd[:-(topNfeat+1):-1] # 得到下標(biāo)值的排序,倒著排#print type(eigValInd)redEigVects = eigVects[:,eigValInd] # 得到topNfeat個(gè)最大的特征向量,構(gòu)成對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換的矩陣lowDDataMat = meanRemoved * redEigVects # 該矩陣則利用N個(gè)特征將原始數(shù)據(jù)轉(zhuǎn)換到新空間中,低維度的矩陣reconMat = (lowDDataMat * redEigVects.T) + meanVals # 降維后的矩陣return lowDDataMat, reconMat # 返回低維矩陣和降維后的矩陣# 繪圖 def plt_dat(dataMat,reconMat):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=20,c='red')plt.show()# 主函數(shù)dataMat=loadDataSet('testSet.txt') lowDMat,reconMat=pca(dataMat, 1) print shape(lowDMat) plt_dat(dataMat,reconMat) lowDMat,reconMat=pca(dataMat, 2) plt_dat(dataMat,reconMat)用到的基本語(yǔ)法:
map()
mean()
cov()
flatten()
numpy矩陣運(yùn)算
運(yùn)行結(jié)果:
可以看出lowDMat包含了降維之后的矩陣,這里是個(gè)一維矩陣。這里圖示1是降維后的數(shù)據(jù)和原始數(shù)據(jù)的對(duì)比。圖示2是改變參數(shù)后的重構(gòu)的數(shù)據(jù)和原始數(shù)據(jù)的對(duì)比,可以看出已經(jīng)幾乎完全重合了。
注意的幾點(diǎn):
- 實(shí)踐中通過(guò)對(duì)X<script type="math/tex" id="MathJax-Element-30">X</script>進(jìn)行奇異值分解來(lái)代替協(xié)方差局針的特征值分解。
- 低維空間的維數(shù)通常由用戶(hù)指定,也可以通過(guò)交叉驗(yàn)證來(lái)選取較好的維數(shù)值
- PCA僅需保留W和樣本的均值向量即可通過(guò)簡(jiǎn)單的向量減法和矩陣-向量乘法將新樣本投影至低維空間中。而其中保存均值向量是為了對(duì)新樣本同樣進(jìn)行中心化。
3. 利用PCA對(duì)半導(dǎo)體制造數(shù)據(jù)降維
- 數(shù)據(jù)集來(lái)自UCI機(jī)器學(xué)習(xí)數(shù)據(jù)庫(kù),包含590個(gè)特征,其中幾乎所有樣本都存在特征缺失,用NaN標(biāo)識(shí),對(duì)于這些缺失值,我們用一些簡(jiǎn)單的方法處理,比如用0去替換NaN,但是由于并不知道這些值的意義,所以該方法不合適。下面通過(guò)replaceNanWithMean將缺失的NaN數(shù)據(jù)用其他樣本的相同特征值平均值填充。
3.1 示例代碼:
# 缺失值替換 def replaceNanWithMean(): datMat = loadDataSet('secom.data', ' ')numFeat = shape(datMat)[1]for i in range(numFeat):meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) # 計(jì)算所有非NaN色平均值datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal # 將所有的NaN置為平均值return datMatdataMat=replaceNanWithMean() meanVals = mean(dataMat, axis=0) # 求平均值(按每一列) meanRemoved = dataMat - meanVals covMat = cov(meanRemoved, rowvar=0) # 計(jì)算協(xié)方差矩陣 eigVals,eigVects = linalg.eig(mat(covMat)) # 得到特征值和特征向量 print eigValsnonzero()
運(yùn)行結(jié)果:
[ 53415197.85687514 21746671.9046592 8248376.61529073 ..., 0.0. 0. ]- 從特征值可以看出,其中很多值都是0,這就是說(shuō)這些特征都是其他特征的副本,可以通過(guò)其他特征來(lái)表示,本身沒(méi)有提供額外的信息。
- 再看下部分?jǐn)?shù)值的數(shù)量級(jí),最前面的值比較大,而后面的特征值變得非常小,這就是說(shuō)只有部分的特征是主要特征
- 最后發(fā)現(xiàn)還有部分特征值是負(fù)值,他們主要源自數(shù)值誤差應(yīng)四舍五入。
3.2 主成分?jǐn)?shù)目和總方差的關(guān)系
可以看出前六個(gè)主成分就覆蓋了數(shù)據(jù)96.8%的方差,而前20個(gè)主成分覆蓋了99.3%的方差,這就說(shuō)明保留前6個(gè)主成分而去除后584個(gè)主成分,我們就可以實(shí)現(xiàn)大概100:1的壓縮***,另外舍棄了噪聲的主成分,將后面的主成分去除便使得數(shù)據(jù)更加干凈。*
4. 筆記
(1)eigValInd = argsort(eigVals)使用
In [7]: a Out[7]: [1, 2, 3, 4, 5, 6, 7, 8]In [8]: argsort(a) Out[8]: array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int64)In [9]: a=[3, 4, 5, 6, 7,1, 2,] # 下標(biāo)值In [19]: bb=argsort(a)In [21]: bb Out[21]: array([5, 6, 0, 1, 2, 3, 4], dtype=int64)In [23]: bb[:-3:-1] Out[23]: array([4, 3], dtype=int64) # 得到了從最后一個(gè)元素-1到-2,包括-3(下標(biāo))In [41]: mm=[[1,2,3,4,5],[6,7,8,9,10]]In [42]: mm=mat(mm)In [43]: mm Out[43]: matrix([[ 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10]])In [44]: bb Out[44]: array([5, 6, 0, 1, 2, 3, 4], dtype=int64)In [45]: bb=bb[:-3:-1]In [46]: bb Out[46]: array([4, 3], dtype=int64)In [47]: mm[:,bb] Out[47]: matrix([[ 5, 4],[10, 9]])總結(jié)
- 上一篇: 济南国网培训作习时间
- 下一篇: 数据的中心化和标准化