日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PCA简化数据

發(fā)布時(shí)間:2024/9/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCA简化数据 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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(ij)
  • 這時(shí)如果丟棄新坐標(biāo)系中的部分坐標(biāo),即把維度降低到d<d,就達(dá)到了降維的目的,此時(shí)樣本在低維中的投影是zi=(zi1,zi2.......zid),其中zij=wTjxixi在低維坐標(biāo)系下第j維的坐標(biāo),現(xiàn)在基于投影的點(diǎn)重構(gòu)原樣本點(diǎn)得到:xi^=dj=1zijwj?

則此時(shí)對(duì)整個(gè)訓(xùn)練集要計(jì)算原樣本點(diǎn)xi與基于投影得到的樣本點(diǎn)xi^之間的距離:

i=1mj=1dzijwj?xi22=i=1mzTizi?2i=1mzTiWTxi+const
=>?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)為:

maxws.ttr(WTXXTW)WTW=1
可以看出兩個(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 eigVals

nonzero()

運(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é)

以上是生活随笔為你收集整理的PCA简化数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。