機器學習實戰(zhàn)-利用PCA來簡化數(shù)據(jù)

在體育比賽中,人們面對的原本是百萬像素的數(shù)據(jù),但是只有球的三維位置才最重要,這就成為降維(dimensionlity reduction)。通常而言,我們在應用其他機器學習算法之前,必須先識別出其相關(guān)特征。
第一種降維稱作主方法分析(Principal Component Analysis,PCA)。
第一個坐標值選擇的是原始數(shù)據(jù)中方差最大的方向,第二個新坐標軸的選擇和第一個坐標軸正交且具有最大方差的方向。
另一種降維技術(shù)是因子分析(Factor Analysis)。在因子分析中,我們假設在觀察數(shù)據(jù)的生成一些觀察不到的隱變量(latent variable)。假設觀察數(shù)據(jù)是這些隱變量和某些噪聲的線性組合。那么隱變量的數(shù)據(jù)可能比觀察數(shù)據(jù)的數(shù)目少,也就是說通過隱變量可以實現(xiàn)數(shù)據(jù)的降維。
還有一種方法就是獨立成分分析(Independent Component Analysis,ICA)。ICA假設數(shù)據(jù)是從N個數(shù)據(jù)源生成的,這一點和因子分析有些類似。假設數(shù)據(jù)為多個數(shù)據(jù)源的混合觀察結(jié)果,這些數(shù)據(jù)源之間在統(tǒng)計上是互相獨立的,而在PCA中之假設數(shù)據(jù)是不相關(guān)的。
在上述3種降維技術(shù)中,PCA的應用目前最為廣泛,因此本章主要關(guān)注PCA。在下一節(jié)中,我們將會對PCA進行介紹,然后再通過一段Python代碼來運行PCA。

主成分分析
優(yōu)點:降低數(shù)據(jù)的復雜性,識別最重要的多個特征
缺點:不一定需要,且可能損失有用信息
適用數(shù)據(jù)類型:數(shù)據(jù)型數(shù)據(jù)

將數(shù)據(jù)轉(zhuǎn)化成前N個主成分的偽代碼大致如下:

去除平均值
計算協(xié)方差矩陣
計算協(xié)方差矩陣的特征值和特征向量
將特征值從打到小排序
保留最上面的N個特征向量
將數(shù)據(jù)轉(zhuǎn)換到上述N個特征向量構(gòu)建的新空間中

下面開始構(gòu)建PCA算法

from numpy import *

def 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)

def pca(dataMat, topNfeat=9999999):#數(shù)據(jù)集,返回特征數(shù)
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #去平均值
    covMat = cov(meanRemoved, rowvar=0) #協(xié)方差
    eigVals,eigVects = linalg.eig(mat(covMat))#特征值,特征矩陣
    eigValInd = argsort(eigVals)            #從小到大排序
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #逆序,從大到小
    redEigVects = eigVects[:,eigValInd]       
    lowDDataMat = meanRemoved * redEigVects#將數(shù)據(jù)轉(zhuǎn)化到新的維度空間
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

我們在testSet.txt文件中加入一個由1000個數(shù)據(jù)點組成的數(shù)據(jù)集,開始進行PCA操作:

In [17]: import pca
    ...: dataMat = pca.loadDataSet('testSet.txt')
    ...: lowDMat, reconMat = pca.pca(dataMat, 1)
    ...: shape(lowDMat)
    ...: 
Out[17]: (1000L, 1L)

lowDMat,包含了降維之后的矩陣。我們可以通過如下命令將降維后的數(shù)據(jù)和原始數(shù)據(jù)一起繪制出來:

import matplotlib
import matplotlib.pyplot as plt
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 = 50, c='red')
plt.show()
    ...:
原始數(shù)據(jù)集(三角形點)及第一主成分(圓形點)

使用如下命令代替PCA調(diào)用,也會看到類似結(jié)果:

lowDMat, reconMat = pca.pca(dataMat, 2)

下面我們先處理一些異常值,用平均值代替NaN:

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]) 
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #將所有nan置為平均值
    return datMat

PCA會給出數(shù)據(jù)中所包含的信息量。數(shù)據(jù)(data)和信息(information)之間具有巨大的差別。數(shù)據(jù)指的是接受的原始材料,其中包含噪聲和不相關(guān)的信息。信息指數(shù)據(jù)中的相關(guān)部分。下面開始操作,首先將所有的NaN值替換為平均值:

In [36]: import pca
    ...: dataMat = pca.replaceNanWithMean()
    ...: 

接下來從pca()函數(shù)中借用一些代碼來達到我們的目的,之所以借用是因為我們想了解中間結(jié)果而非最后輸出結(jié)果,調(diào)用如下語句去除均值:

In [37]: meanVals = mean(dataMat, axis = 0)
    ...: meanRemoved = dataMat - meanVals
    ...:

然后計算協(xié)方差矩陣:

In [38]: covMat = cov(meanRemoved, rowvar=0)

最后對該矩陣進行特征值分析:

In [39]: eigVals,eigVects = linalg.eig(mat(covMat))
    ...: 
    ...: eigVals
    ...: 
Out[39]: 
array([ 53415197.85687517+0.j,  21746671.90465918+0.j,
         8248376.61529074+0.j, ...,         0.00000000+0.j,
               0.00000000+0.j,         0.00000000+0.j])

我們會發(fā)現(xiàn)超過20%的特征值都是0。這意味著這些特征都是其他特征的副本,也就是說,他們可以通過其他特征來表示,而本身并沒有提供額外的信息。
接下來,我們了解一下部分數(shù)值的數(shù)量級。最前面15個值的數(shù)量級大于10的五次方,實際上那以后的值都變得非常小。這相當于告訴我們部分重要特征,重要特征的數(shù)目也很快就會下降。
最后,我們注意到一些負值,他們主要源于數(shù)值誤差,應該四舍五入為0。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容