機器學習實戰筆記-利用PCA來簡化數據


本篇文章不涉及理論推理。如果你想知道為什么通過協方差矩陣算出特征向量和特征值,然后對特征值進行排序后找到對應的特征向量與原矩陣X相乘即可得到降維后的X,可以去看看這篇文章:
http://blog.csdn.net/sinat_17451213/article/details/51193720
里面包含了如何通過基(對應特征向量)來對向量降維,如何通過原始數據集的協方差矩陣來得到特征值和特征向量使特征向量乘以原始矩陣得到的變換后的數據集的協方差矩陣滿足使各個字段方差盡可能小並且使字段間線性無關。

13.1 降維技術

對數據進行簡化有如下一系列的原因:
使得數據集更易使用;
降低很多算法的計算開銷;
去除噪聲;
使得結果易懂。

在已標注與未標注的數據上都有降維技術。這里我們將主要關注未標注數據上的降維技術,該技術同時也可以應用於已標注的數據。
第一種降維的方法稱為主成分分析(Principal Component Analysis,PCA)。在PCA中,數據從原來的坐標系轉換到了新的坐標系,新坐標系的選擇是由數據本身決定的。第一個新坐標軸選擇的是原始數據中方差最大的方向,第二個新坐標軸的選擇和第一個坐標軸正交且具有最大方差的方向。該過程一直重復,重復次數為原始數據中特征的數目。我們會發現,大部分方差都包含在最前面的幾個新坐標軸中。因此,我們可以忽略余下的坐標軸,即對數據進行了降維處理。

另外一種降維技術是因子分析(Factor Analysis)。在因子分析中,我們假設在觀察數據的生成中有一些觀察不到的隱變量(latent variable)。假設觀察數據是這些隱變量和某些噪聲的線性組合。那么隱變量的數據可能比觀察數據的數目少,也就是說通過找到隱變量就可以實現數據的降維。因子分析已經應用於社會科學、金融和其他領域中了。

還有一種降維技術就是獨立成分分析(Independent Component Analysis,ICA )。ICA假設數據是從N個數據源生成的,這一點和因子分析有些類似。假設數據為多個數據源的混合觀察結果,這些數據源之間在統計上是相互獨立的,而在PCA中只假設數據是不相關的。同因子分析一樣,如果數據源的數目少於觀察數據的數目,則可以實現降維過程。

13.2 PCA

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

13.2.1移動坐標軸

考慮一下圖13-1中的大量數據點。如果要求我們畫出一條直線,這條線要盡可能覆蓋這些點,那么最長的線可能是哪條?我做過多次嘗試。在圖13-1中,3條直線中B最長。在PCA中 ,我們對數據的坐標進行了旋轉,該旋轉的過程取決於數據的本身。第一條坐標軸旋轉到覆蓋數據的最大方差位置,即圖中的直線B。數據的最大方差給出了數據的最重要的信息。

在選擇了覆蓋數據最大差異性的坐標軸之后,我們選擇了第二條坐標軸。假如該坐標軸與第一條坐標軸垂直,它就是覆蓋數據次大差異性的坐標軸。這里更嚴謹的說法就是正交(orthogonal)。當然,在二維平面下,垂直和正交是一回事。在圖13-1中,直線C就是第二條坐標軸。利用PCA,我們將數據坐標軸旋轉至數據角度上的那些最重要的方向。(這里提到的數據差異性其實指的就是一個特征的方差,正交是指特征之間無線性相關性)
這里寫圖片描述

通過PCA進行降維處理,我們就可以同時獲得SVM和決策樹的優點:一方面,得到了和決策樹一樣簡單的分類器,同時分類間隔和SVM — 樣好。考察圖13-2中下面的圖,其中的數據來自於上面的圖並經PCA轉換之后繪制而成的。如果僅使用原始數據,那么這里的間隔會比決策樹的間隔更大。另外,由於只需要考慮一維信息,因此數據就可以通過比SVM簡單得多的很容易采用的規則進行區分。
這里寫圖片描述

在圖13-2中,我們只需要一維信息即可,因為另一維信息只是對分類缺乏貢獻的噪聲數據。在二維平面下,這一點看上去微不足道,但是如果在高維空間下則意義重大。
我們已經對PCA的基本過程做出了簡單的闡述,接下來就可以通過代碼來實PCA過程。前面我曾提到的第一個主成分就是從數據差異性最大(即方差最大)的方向提取出來的,第二個主成分則來自於數據差異性次大的方向,並且該方向與第一個主成分方向正交。通過數據集的協方差矩陣及其特征值分析,我們就可以求得這些主成分的值。
一旦得到了協方差矩陣的特征向量,我們就可以保留最大的N個值。這些特征向量也給出了個最重要特征的真實結構。我們可以通過將數據乘上這N個特征向量而將它轉換到新的空間

13.2.2 在Numpy中實現PCA

將數據轉換成前N個主成分的偽碼大致如下:
去除平均值
計算協方差矩陣
計算協方差矩陣的特征值和特征向量
將特征值從大到小排序
保留最上面的N個特征向量
將數據轉換到上述N個特征向量構建的新空間中

PCA算法,代碼如下;

from numpy import *

def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    #以delim作為分隔符分割數據,默認為'\t'
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    #我用的是python3,需要再做一次list轉化
    datArr = [list(map(float,line)) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat=9999999):
    #用mean計算出矩陣每列特征的均值,axis表示列計算
    meanVals = mean(dataMat, axis=0)
    #remove mean
    meanRemoved = dataMat - meanVals 
    #通過cov()計算出協方差矩陣
    covMat = cov(meanRemoved, rowvar=0)
    #通過linalg.eig()算出特征值和特征向量
    eigVals,eigVects = linalg.eig(mat(covMat))
    #sort, sort goes smallest to largest
    #對特征值進行排序,得出的是下標
    eigValInd = argsort(eigVals)
    #cut off unwanted dimensions
    #注意這里的寫法,實際上是從倒數第一個(也就是最大的)往左總計N個值           
    eigValInd = eigValInd[:-(topNfeat+1):-1]
    #得出經過篩選的特征向量,由最大到最小排列
    #reorganize eig vects largest to smallest
    redEigVects = eigVects[:,eigValInd]
    #得出降維后的矩陣
    #transform data into new dimensions       
    lowDDataMat = meanRemoved * redEigVects
    #重構矩陣,即得出降維后矩陣在原緯度下是什么樣的,便於之后繪圖比較
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

測試截圖如下:
這里寫圖片描述

13.3 示例:利用PCA對半導體制造數據降維

本次數據包含很多的缺失值。這些缺失值是以NaN (Not a Number的縮寫)標識的。對於這些缺失值,我們有一些處理辦法(參考第5章)。在590個特征下,幾乎所有樣本都有NAN,因此去除不完整的樣本不太現實。盡管我們可以將所有的NAN替換成0 ,但是由於並不知道這些值的意義,所以這樣做是個下策。如果它們是開氏溫度,那么將它們置成0這種處理策略就太差勁了。下面我們用平均值來代替缺失值,平均值根據那些非NAN得到。

將NAN替換成平均值的函數,代碼如下:

def replaceNanWithMean(): 
    #以空格為分隔符獲取secom.data
    datMat = loadDataSet('secom.data', ' ')
    #求出特征數目
    numFeat = shape(datMat)[1]
    #遍歷每列特征,置NAN為每列非NAN特征值的均值
    for i in range(numFeat):
        #values that are not NaN (a number)
        #~isnan返回boolean矩陣,其中不是NAN的位置標為true,是NAN的標為false
        #nonzero返回元組,其中0處為非0(True為非0)元素行標,1處存放0元素行標
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) 
        #set NaN values to mean
        #與上一行類似,找出nan元素位置,賦值為該列特征的均值
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  
        return datMat

測試截圖如下:
這里寫圖片描述
這里寫圖片描述

我們會看到一大堆值,但是其中的什么會引起我們的注意?我們會發現其中很多值都是0。實際上,其中有超過20%的特征值都是0。這就意味着這些特征都是其他特征的副本,也就是說,它們可以通過其他特征來表示,而本身並沒有提供額外的信息。
接下來,我們了解一下部分數值的數量級。最前面15個值的數量級大於10510^5,實際上那以后的值都變得非常小。這就相當於告訴我們只有部分重要特征,重要特征的數目也很快就會下降
最后,我們可能會注意到有一些小的負值,它們主要源自數值誤差應該四舍五入成0。
在圖13-4中已經給出了總方差的百分比,我們發現,在開始幾個主成分之后,方差就會迅速下降。

這里寫圖片描述

表13-1給出了這些主成分所對應的方差百分比和累積方差百分比。瀏覽“累積方差百分比( % )”這一列就會注意到,前六個主成分就覆蓋了數據96.8%的方差,而前20個主成分覆蓋了99.3%的方差。這就表明了,如果保留前6個而去除后584個主成分,我們就可以實現大概100 : 1的壓縮比。另外,由於舍棄了噪聲的主成分,將后面的主成分去除便使得數據更加干凈。

這里寫圖片描述

於是,我們可以知道在數據集的前面多個主成分中所包含的信息量。我們可以嘗試不同的截斷值來檢驗它們的性能。有些人使用能包含90%信息量的主成分數量,而其他人使用前20個主成分。我們無法精確知道所需要的主成分數目,必須通過在實驗中取不同的值來確定。有效的主成分數目則取決於數據集和具體應用。
上述分析能夠得到所用到的主成分數目,然后我們可以將該數目輸人到PCA算怯中,最后得到約簡后數據就可以在分類器中使用了。

13.4 本章小結

降維技術使得數據變得更易使用,並且它們往往能夠去除數據中的噪聲,使得其他機器學習任務更加精確降維往往作為預處理步驟,在數據應用到其他算法之前清洗數據。有很多技術可以用於數據降維,在這些技術中,獨立成分分析因子分析主成分分析比較流行,其中又以主成分分析應用最廣泛。
PCA 可以從數據中識別其主要特征,它是通過沿着數據最大方差方向旋轉坐標軸來實現的。選擇方差最大的方向作為第一條坐標軸,后續坐標軸則與前面的坐標軸正交。協方差矩陣上的特征值分析可以用一系列的正交坐標軸來獲取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM