Hatena::ブログ(Diary)

作業記録/備忘録(仮) このページをアンテナに追加 RSSフィード

2012/01/22

コレスポンデンス分析(1)下準備  行列の列和、行和を計算する

統計解析の手法の一つであるコレスポンデンス分析(対応分析、コレポン、CAとも呼ばれる)をpythonで実装する。
コレスポンデンス分析では、行和、列和、特異値分解(SVD)などを行うため、本題に入る前に、超簡単な行列演算で肩慣らしをする。

参考サイト
SciPyの使い方: 行列演算
http://handasse.blogspot.com/2007/07/scipy.html

リストオブジェクトの使い方
http://www.gesource.jp/programming/python/code/0017.html

コード

書いたというほどのものではないが...

from scipy import array
matrix = array( [[15,45,27,23],
                 [17,30,48,25],
                 [20,10,26,44],
                 [36,10,20,24],
                 [40, 5, 8,27]] );
print "Original matrix:"
print matrix

print "",matrix[0,:] # 1行目を表示
print "",matrix[:,0] # 1列目を表示

print "行和",sum(matrix[0,:]) # 1行目の総和を計算
print "列和",sum(matrix[:,0]) # 1列目の総和を計算
表示結果

上記コードを実行した結果。

$ ./correspondense_an.py
Original matrix:
[[15 45 27 23]
 [17 30 48 25]
 [20 10 26 44]
 [36 10 20 24]
 [40  5  8 27]]
行 [15 45 27 23]      
列 [15 17 20 36 40]
行和 110   <---1行目の和=15+45+27+23になっている
列和 128   <---1列目の和=15+17+20+36+40になっている

注意点

行列計算のモジュール"mat"で、以下のようにもできるが、行と列を対象に扱うことができない(みたい)。
なので、scipyのarrayのimportのほうが良さそうな気配。
(ちゃんとしたやり方あるのかもしれないが、少なくとも私は理解できなかったorz)

from scipy import linalg, mat, dot;                                                                                                  

matrix = mat( [[15,45,27,23],
               [17,30,48,25],
               [20,10,26,44],
               [36,10,20,24],
               [40,5,8,27]] );    

#print "行和",sum(matrix[0,:])  #これだとだめ                                      
print "列和",sum(matrix[:,0]) # OK

print "行和",sum(matrix[0,:].tolist()[0]) # 一回リストにしてsumすることは可能みたい。                                                                                      
#print "列和",sum(matrix[:,0].tolist())  # だめ。そもそも、列と行で形式が非対称になってるので。中見ればすぐ分かる。            

2012/01/20

numpy on Android

numpyが、Android上(のsl4a)でも使えるようだ。

Port to SL4A (Android)
http://projects.scipy.org/numpy/ticket/1969

ここによると、「Matthew Turk has successfully hacked Numpy to run on Android already:」 だと。

NumPy Port
http://groups.google.com/group/android-scripting/browse_thread/thread/2378edd0dc5048fb?pli=1


numpy をimportすると、SVDのモジュールなども使えるし、簡単な統計解析をアプリでさせたい時など、色々遊べそうだ。

2012/01/17

python 特異値分解(SVD)

scipyと呼ばれる科学演算モジュールインストールして、行列演算を試す。

参考にしたのはこちら。

SVD in Python
http://radialmind.blogspot.com/2009/11/svd-in-python.html

SciPyを用いて潜在的意味解析(LSA)
http://d.hatena.ne.jp/billest/20090819/1250635423

■numpy,scipyをインストール
$ sudo apt-get install python-numpy python-numpy-doc
$ sudo apt-get install python-scipy

※なぜか、下記のeasy_installでうまくいかなかったので、とりあえず、上の方法でやった。
$ sudo apt-get install python-dev
$ sudo easy_install numpy
$ sudo easy_install scipy

■SVDのコード
"SVD in Python"のコードをコピペしてみて、まず動くか確認した。
続いて、dimensions = 1を2に変えてみて、reconstructed:の結果が元に一致することなどを確認した。

CA(対応分析)などもちょっと練習してみるかな。