PCA analysis with python

PCA 解析と呼ばれる,あるデータの中から表現しやすい基底ベクトルを探す方法.だと思う.
http://www.logos.ic.i.u-tokyo.ac.jp/~s1s5/pukiwiki/index.php?programming%2Fpython%2Fscipy
を参考にとりあえずやってみた.

#!/usr/bin/python

import random
import numpy
from numpy import array
from numpy import linalg
  
def PCA(X):
    x_mean = array( map( sum, X.T) ) / len( X ) 
    X_ = X - x_mean
    X_t = numpy.dot( X_.T, X_ ) / len(X)
    lam, vec = linalg.eig( X_t )
    ans = zip( lam, vec.T )
    ans.sort( reverse = True )
    return ans 

if __name__=='__main__':
    a=[]
    for i in range( 100 ):
        a.append([
                random.gauss(0,1),
                random.gauss(0,4),
                random.gauss(0,3),
                random.gauss(0,2)
                ])  
    a=numpy.array(a)
    res=PCA(a)
    for i in res:
        print i

PCA の定義はそのまま.PCA がよく理解できるきれいな書き方だ.他のサンプルとか世の中にゴロゴロしているけど,これは python(numpy) がよく理解されてる.

これを実行すると

(16.688696312174812, array([-0.03858786,  0.99026608,  0.13220014,  0.02017925]))
(8.9789418970574442, array([ 0.03921247, -0.12875949,  0.98783224, -0.07791557]))
(3.020614980555941, array([ 0.07700387, -0.02684844,  0.07185176,  0.9940759 ]))
(0.88439073406682411, array([-0.99551181, -0.04553302,  0.03934347,  0.07304158]))

という結果を得ます.乱数は4次元空間でそれぞれの方向にふっています.したがって PCA の結果分解されたベクトルは乱数幅の大きい順に並んでいるのが分かります.