[機器學習筆記]主成分分析PCA簡介及其python實現


  主成分分析(principal component analysis)是一種常見的數據降維方法,其目的是在“信息”損失較小的前提下,將高維的數據轉換到低維,從而減小計算量。

  PCA的本質就是找一些投影方向,使得數據在這些投影方向上的方差最大,而且這些投影方向是相互正交的。這其實就是找新的正交基的過程,計算原始數據在這些正交基上投影的方差,方差越大,就說明在對應正交基上包含了更多的信息量。后面會證明,原始數據協方差矩陣的特征值越大,對應的方差越大,在對應的特征向量上投影的信息量就越大。反之,如果特征值較小,則說明數據在這些特征向量上投影的信息量很小,可以將小特征值對應方向的數據刪除,從而達到了降維的目的。

  PCA的全部工作簡單點說,就是對原始的空間中順序地找一組相互正交的坐標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第1、2個軸正交的平面中方差最大的,這樣假設在N維空間中,我們可以找到N個這樣的坐標軸,我們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數據的損失最小。

  因此,關鍵點就在於:如何找到新的投影方向使得原始數據的“信息量”損失最少?

1.樣本信息量”的衡量

  樣本的“信息量”指的是樣本在特征方向上投影的方差。方差越大,則樣本在該特征上的差異就越大,因此該特征就越重要。以《機器學習實戰》上的圖說明,在分類問題里,樣本的方差越大,越容易將不同類別的樣本區分開。

  圖中共有3個類別的數據,很顯然,方差越大,越容易分開不同類別的點。樣本在X軸上的投影方差較大,在Y軸的投影方差較小。方差最大的方向應該是中間斜向上的方向(圖中紅線方向)。如果將樣本按照中間斜向上的方向進行映射,則只要一維的數據就可以對其進行分類,相比二維的原數據,就相當降了一維。

       在原始數據更多維的情況下,先得到一個數據變換后方差最大的方向,然后選擇與第一個方向正交的方向,該方向是方差次大的方向,如此下去,直到變換出與原特征個數相同的新特征或者變換出前N個特征(在這前N個特征包含了數據的絕大部分信息),簡而言之,PCA是一個降維的過程,將數據映射到新的特征,新特征是原始特征的線性組合。

2.計算過程因為插入公式比較麻煩,就直接采用截圖的方式

3.python實現

 

#coding=utf-8
from numpy import *

'''通過方差的百分比來計算將數據降到多少維是比較合適的,
函數傳入的參數是特征值和百分比percentage,返回需要降到的維度數num'''
def eigValPct(eigVals,percentage):
    sortArray=sort(eigVals) #使用numpy中的sort()對特征值按照從小到大排序
    sortArray=sortArray[-1::-1] #特征值從大到小排序
    arraySum=sum(sortArray) #數據全部的方差arraySum
    tempSum=0
    num=0
    for i in sortArray:
        tempSum+=i
        num+=1
        if tempsum>=arraySum*percentage:
            return num

'''pca函數有兩個參數,其中dataMat是已經轉換成矩陣matrix形式的數據集,列表示特征;
其中的percentage表示取前多少個特征需要達到的方差占比,默認為0.9'''
def pca(dataMat,percentage=0.9):
    meanVals=mean(dataMat,axis=0)  #對每一列求平均值,因為協方差的計算中需要減去均值
    meanRemoved=dataMat-meanVals
    covMat=cov(meanRemoved,rowvar=0)  #cov()計算方差
    eigVals,eigVects=linalg.eig(mat(covMat))  #利用numpy中尋找特征值和特征向量的模塊linalg中的eig()方法
    k=eigValPct(eigVals,percentage) #要達到方差的百分比percentage,需要前k個向量
    eigValInd=argsort(eigVals)  #對特征值eigVals從小到大排序
    eigValInd=eigValInd[:-(k+1):-1] #從排好序的特征值,從后往前取k個,這樣就實現了特征值的從大到小排列
    redEigVects=eigVects[:,eigValInd]   #返回排序后特征值對應的特征向量redEigVects(主成分)
    lowDDataMat=meanRemoved*redEigVects #將原始數據投影到主成分上得到新的低維數據lowDDataMat
    reconMat=(lowDDataMat*redEigVects.T)+meanVals   #得到重構數據reconMat
    return lowDDataMat,reconMat

 

 

Reference

1. Peter Harrington,《機器學習實戰》,人民郵電出版社,2013

2. http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html (其中有PCA的計算實例)

3. 張學工,《模式識別》(第三版),清華大學出版社,2010

 


免責聲明!

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



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