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