主成分分析(PCA)

3658 ワード

昨日Robust Principal Component Analysisを見たとき、勉強していたPCAを思い出しました.ここでPeter Harringtonの「機械学習実戦」を参考に、前学期勉強していたPCAアルゴリズム(原理+Python実現)を整理しました.皆さんの交流を歓迎します.
1.PCA原理
PCAは線形代数の中のK-L変換であり、平均二乗誤差準則の下で歪みが最も小さい変換であり、元の空間を特徴ベクトル空間内に変換し、数学で表すことができる.
Ax=λx

フィーチャーベクトルは、異なる周波数とフィーチャー値がその振幅を表す.具体的な操作:PCAでは、元の座標系から新しい座標系にデータを変換し、新しい座標系の選択はデータそのものによって決まる.最初の新しい座標軸は元のデータの中で分散が最大の方向を選択し、2番目の新しい座標軸は最初の新しい座標軸と直交して最大分散を持つ方向を選択し、この過程を1回繰り返し、繰り返し回数は元のデータの特徴の数であり、事実は大部分の分散が一番前のいくつかの新しい座標軸に含まれていることを発見したので、残りの座標軸を無視することができ、すなわち、データの次元ダウンを実現します.
2.PCAの特徴
利点:データの複雑性を低減し、重要な複数の特徴と欠点を識別する:有用な情報を損失する可能性がある適用データ型:数値型データ、
3.PCA実現
'''
PCA       N        :
1.     ;
2.       ;
3.                ;
4.          ;
5.      N     ;
6.        N            .(      )

  :      
  :datMat       ,topNfeat       
  :                       
'''
def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0) #          
    meanRemoved = dataMat - meanVals #                 
    covMat = cov(meanRemoved, rowvar=0) #       ,  n-1             ,  cov(X,0) = cov(X)    n-1(n     ),cov(X,1)    n
    eigVals,eigVects = linalg.eig(mat(covMat)) #                
    eigValInd = argsort(eigVals) #              ,                    
    eigValInd = eigValInd[:-(topNfeat+1):-1] #                      N    ,        
    redEigVects = eigVects[:,eigValInd] #       N                 ,      
    lowDDataMat = meanRemoved * redEigVects #           *    ,       ,      N
    reconMat = (lowDDataMat * redEigVects.T) + meanVals #                (    ,           )
    return lowDDataMat, reconMat #                       

4.PCAテスト
'''
  :      
  : fileName   , delim                ,   tab '\t'
  :    float            
'''
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] #  map()  ,              float 
    return mat(datArr) # float            

datMat = pca.loadDataSet('textSet.txt')
lowDMat, reconMat = pca.pca(dataMat, 1)
shape(lowDMat)m #(1000, 1)