実験
並列の実験が終わった.LU分解やNQueenを逐次と並列で高速に解こうといった内容.並列の方はMPI等を使わずにpthreadで.(実験ページ)
LUの方はキャッシュミスをどれだけ減らすか,という感じだった.適当にブロック化してoprofileでプロファイルを取るとキャッシュミスが減ったよ!やったねたえちゃん!みたいな.
SIMDイントリンシック命令を加えるのは実験ページに載っていないのでズルい気もしたが,SSEについては言及されているので気にしないことにした.*1.まぁキャッシュミスを減らす方が性能に影響したんだけど.
ソースコードに溢れる_mm_add_pd等の文字列.可読性が落ちて素晴らしい!気持ちいいね!*2
課題はどちらもググれば色々事例が出てくるので,何だかなぁと言った感じ.特にNQueenの方はググって枝刈りの方法見つけちゃったがな.まぁぼちぼち面白かったけど.
ちなみに並列の実験は先週ぐらいに終了して,今はエージェントの実験に移っている.内容は「SVMでオークションの入札を予測して,最適な入札を考える」といったもの.
二次計画問題を解く部分はライブラリに丸投げ.実験のページではQuadProg++を紹介しているのだが,QuadProg++は半正定値行列の扱いが上手くない(?)ようで,ライブラリがサクサク死んでくれる.サークルの先輩からその話を聞いていたので,対角成分に誤差を加えるという投げ遣りな対処で乗り切った.酷い.実験wikiに解決方法が全く載っていないのが何とも.
最後にどうでもいい話だが,どちらの実験でもオプションの解析を手作業でやっている方をちらほら見かけた.悪いとは言わないが,getopt使った方が楽だと思う…….*3
混合ガウスでiris datasetをクラスタリング
Rで学ぶクラスタ解析でやってることを何故かpythonでやってみたよという話.
コードはgistに置いてみた.gistyが何故か入れれなくてしょぼーん.混合ガウスはPRML9章から.
純度とかエントロピー
混合ガウス
irisのデータはここから取得.そのままだとちょっと微妙な気もしたので適当にcut
$ cut --delimiter=, -f1-4 iris.data | sed -e 's/,/ /g' > iris.input $ cut --delimiter=, -f5 iris.data | cut -c6- > iris.ans
REPLで適当に試す
>>> import scipy as sp >>> import mydefs >>> from gmm import gmm >>> x = sp.loadtxt("data/iris.input") >>> ans = gmm(x, 3) >>> cls = ans['classification'] >>> goldans = sp.loadtxt("data/iris.ans", dtype="|S5") >>> mydefs.myeval(cls, goldans) Entropy: 0.10167363274 Purity: 0.966666666667
初期値に応じて結果が結構変わる上,たまに潰れて発散する ^^;
3回後期履修科目
全部で18コマ(+α)になった.以下雑感.
数理統計
昨年履修ミスした科目.人多すぎ.教科書は指定されたので,人が減らないようなら出席はしない方向で.
集積システム入門
N型とかP型とかの説明から入るあたり凄くゆとり講義でした.講師「情報学科の学生さんは電気回路とか嫌い」.すみません……
計算と論理
1限な上に,資料がpdfで配布されていてこれもまた眠気との闘(ry *1
ソフトウェア工学
初回講義は真面目に聞かずに別のことをしてしまった.というわけで感想は無し.つ,次からちゃんと聞きます.
生命情報学
初回の講義でプロジェクタが使えない→教卓にノートPCを開き,そこでスライドを写しながらプレゼン.立ち見が出るような講義だったので,「その発想は無かった」.生物とかさっぱりだが,出席とレポのみの科目なので頑張る…!
マルチメディア
講師は3人.コンピュータビジョン,自然言語処理,地図・文書画像処理等の色々な内容をやるらしい.あまり深入りせずに表面だけサラっと紹介していく感じなのだろうか.
情報システム
情報検索とかそんな話.IIRは中途半端にしか読んでないので,ちゃんと読みたいなーと思ったりした(講義関係無い
ヒューマンインターフェース
講師の話が面白い.分野としては興味サッパリなのだが,「良いデザインを作れるようになるのではなく,デザイナーさんとコミュニケーションできるようになるのが目的」らしいので,まぁサボらんように頑張る.
工業数学A1
昨年度敗北した.専門の再履は実は始めてのハズ.内容としては留数定理のあたりまで.工業数学A3で留数定理が必要になる→自習,というのを前期でやったので,今年は大丈夫だと信じたい.
計算機科学実験及演習(前半,6コマ)
前半は画像処理(QRコードの読み取り),ロボットプログラミング,並列プログラミングの中から1つを選択.画像を希望したが抽選の結果並列に回された.
並列の内容は{逐次,並列}{LU分解,N-Queen}の高速化.逐次のLU分解は初期状態から3倍ぐらいの速度になったあたりで飽きた.今までキャッシュミス等を意識せずにコードを書いてきたんだなぁと身に染みて感じた.速度ランキングもあるので頑張って上位を狙いたいところ.
*1:せっかく大学生をやっているんだから,家で資料を読むのでは無く講義を聞きに行くのは大切なんだろうけど
zshのalias -sで解凍
zshのalias -sは拡張子に合わせてコマンドを実行できて便利なのだが*1
alias -s 'tar.gz'='tar xzvf'
としても期待通りには動いてくれない(何か間違っているのかな……)
仕方が無いので
function extract() { case $1 in *.tar.gz|*.tgz) tar xzvf $1 ;; *.tar.xz) tar Jxvf $1 ;; *.zip) unzip $1 ;; *.lzh) lha e $1 ;; *.tar.bz2|*.tbz) tar xjvf $1 ;; *.tar.Z) tar zxvf $1 ;; *.gz) gzip -dc $1 ;; *.bz2) bzip2 -dc $1 ;; *.Z) uncompress $1 ;; *.tar) tar xvf $1 ;; *.arj) unarj $1 ;; esac } alias -s {gz,tgz,zip,lzh,bz2,tbz,Z,tar,arj,xz}=extract
としましたとさ.
これで
$ ./hogefuga.tar.gz
等で解凍できるようになる.
ちなみに他の環境で解凍コマンドを忘れて困りそうだが,今迄もC-rの検索から解凍していたのであまり変わらない気もする.*2
追記(2010/10/21)
コメントでaunpackというのを教えてもらったので,aptitudeからatoolをインストールし,設定は
alias -s {gz,tgz,zip,lzh,bz2,tbz,Z,tar,arj,xz}=aunpack
に変更した.既にあるものを使うのが一番ですね!(おい
*1:参考: http://journal.mycom.co.jp/column/zsh/016/index.html
*2:*.zipと*.tar.gz以外の解凍はまともに覚えていない……
EMアルゴリズムで混合ガウス分布
numpyのufuncの説明を読んで,何かちょろっと書きたい気分になったので書いた.相変わらずの生産性0.
実行すると適当に乱数でデータを生成し,混合ガウス分布のパラメータを推定した後,負担率に応じて色分け.
ufuncのルールをある程度理解したので,3次以上のarrayの扱いがマシになり,ループが減ったものの,弊害として一行に170文字以上書くというPEP8(笑)なコードが出来あがった*1.だからどうしたんだという気もするが.
#!/usr/bin/python # -*- coding: utf-8 -*- # PRML chapter 9 # Gaussian Mixture Model import scipy as sp from scipy.linalg import det, inv def multivariate_normal_pdf(x, u, sigma): D = len(x) x, u = sp.asarray(x), sp.asarray(u) y = x-u return sp.exp(-(sp.dot(y, sp.dot(inv(sigma), y)))/2.0) / (((2*sp.pi)**(D/2.0)) * (det(sigma) ** 0.5)) def gmm(X, K, iter=1000, tol=1e-6): """ Gaussian Mixture Model Arguments: - `X`: Input data (2D array, [[x11, x12, ..., x1D], ..., [xN1, ... xND]]). - `K`: Number of clusters. - `iter`: Number of iterations to run. - `tol`: Tolerance. """ X = sp.asarray(X) N, D = X.shape pi = sp.ones(K) * 1.0/K mu = sp.rand(K, D) sigma = sp.array([sp.eye(D) for i in xrange(K)]) L = sp.inf for i in xrange(iter): # E-step gamma = sp.apply_along_axis(lambda x: sp.fromiter((pi[k] * multivariate_normal_pdf(x, mu[k], sigma[k]) for k in xrange(K)), dtype=float), 1, X) gamma /= sp.sum(gamma, 1)[:, sp.newaxis] # M-step Nk = sp.sum(gamma, 0) mu = sp.sum(X*gamma.T[..., sp.newaxis], 1) / Nk[..., sp.newaxis] xmu = X[:, sp.newaxis, :] - mu sigma = sp.sum(gamma[..., sp.newaxis, sp.newaxis] * xmu[:, :, sp.newaxis, :] * xmu[:, :, :, sp.newaxis], 0) / Nk[..., sp.newaxis, sp.newaxis] pi = Nk / N # Likelihood Lnew = sp.sum(sp.log2(sp.sum(sp.apply_along_axis(lambda x: sp.fromiter((pi[k] * multivariate_normal_pdf(x, mu[k], sigma[k]) for k in xrange(K)), dtype=float), 1, X), 1))) if abs(L-Lnew) < tol: break L = Lnew print "L=%s" % L return dict(pi=pi, mu=mu, sigma=sigma, gamma=gamma) if __name__ == '__main__': data = sp.append(sp.random.multivariate_normal([-3.5, 5.0], sp.eye(2)*4, 50), sp.random.multivariate_normal([-8.2, 10.0], sp.eye(2)*2, 70)).reshape(50+70, 2) K = 2 d = gmm(data, K) print "π=%s\nμ=%s\nΣ=%s" % (d['pi'], d['mu'], d['sigma']) gamma = d['gamma'] import matplotlib.pyplot as plt plt.scatter(data[:, 0][gamma[:, 0] >= 0.5], data[:, 1][gamma[:, 0] >= 0.5], color='r') plt.scatter(data[:, 0][gamma[:, 1] > 0.5 ], data[:, 1][gamma[:, 1] > 0.5 ], color='g') plt.show()
"Rで学ぶクラスタ解析"を今読んでおり,それに習ってirisとかのデータを試してエントロピーとか適当に指標とってみようかと思ったけど,やる気が無かったのでまた後日 ;-p
*1:まぁ適当に括弧の中で改行すればいいのだが