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 の結果分解されたベクトルは乱数幅の大きい順に並んでいるのが分かります.