mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
ハッシュの設計には
の2つの自由度があるが, このうちデータ構造はどちらか選ぶだけなので
除くとすると, 残るのはハッシュ関数の設計。
で, 伝統的にこれは普通えいや, と適当に決めてしまう。別の言い方をすると,
これが最適な解, というのは知られていない(多分)。
横軸は時間(=単語)。この Cranfield コーパスの記事は160 wordsくらいあった らしい。
研究上 LDA をちゃんと実装する必要が生じたので(これまでは Gibbs sampler をCで 書いていて, MAP推定になっていてわりとナイーブだった), LDAのテクニカルレポートを見直していたのだが, あれほど前に難しいと思った付録の パラメータ推定の部分が普通にわかる。 人間の進歩ってすごいなぁ, と思うわけだけど, それは置いといて。
基本的な推定は上田さんがおっしゃっているほど *1 難しくはなくて, わかれば別に難しくないのだが *2 (そのうちエッセンスを紹介します), 拡張としてβ(=p(w|z)のマトリクス)を最尤推定する (Empirical Bayesという) のではなくて, (uniform) Dirichlet prior を与えて変分ベイズ推定する のが導出できない。
この場合, βに関しても p(β|λ) という確率分布があって,
βに関して積分してλを求める。このとき,
<log p(w|z)> = ∫Dir(β|λ)logβ_kdβ = Ψ(λ_k) - Ψ(Σ_k λ_k)
がどこかに出てくるはず。..だが, 論文にはもっと簡単な式になっている。
きのう, 今日とうげーと言うような積分式を一日中計算した結果だと(今数えたら, A4 9枚だった(裏も使っている
のがある。))
K(logΓ(Kη)-KlogΓ(η)) + ΣΣ(N(v,k)φ_vk+η-1)(Ψ(λ_kv)-Ψ(Σλ_kv)) v k vを λ_kv に関して最適化するという非線型な最適化になるはず (上のΨ関数が出てきているのに注意)。
#!/bin/sh gs -dBATCH -dNOPAUSE -sDEVICE=ppmraw -sOutputFile=- -q "$@"を使って, % ps2ppm hoge.ps > hoge.ppm のようにするといいようだ。
#!/bin/sh gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -r100 -sOutputFile=- -q "$@"-r* が解像度(resolution)のよう。
松本研でも gs は 7.05, mint は 5.50 なので, そのままでは使えない模様。 gs を不用意にアップデートして gv が使えなくなったりすると大変なので, gs のバージョンが自然に上がったら使ってみることにしようかなと思います。
session () { screen -X sessionname "$@" eval "STY=$STY:r.$@" }ただし, $STY の変更はこれを実行したシェルだけなので, 他に同時に走っている シェルでは /tmp/uscreens/S-username/* を見たりして$STYをアップデート する必要があるかも。
_screen () { reply=(`screen -ls | awk '/^[ \t]*[0-9][0-9]+/{ split($1,a,"."); print a[1] }'`) } compctl -K _screen screencompinit が重いのと余計な補完をしてくれるため, わざと使っていないので, compctl になっているのに注意。
ただし, 普通に C-; を設定しても, そんなコードは存在しないのでバインドできない。
が, 普通X上で使うことが今は仮定できるので, その場合は, C-; が C-] のコードを
出すように ~/.Xresources で設定してあげれば実現できる。
具体的には, .screenrc が
escape ^]]だった場合, .Xresources に次のように書いておく。
KTerm*VT100*Translations: #override \ Ctrl <Key> ;: string(0x1d) \n\ Meta Ctrl <Key> p: string(0x1d) string("[") string(0x15) \n\ Meta Ctrl <Key> n: string(0x1d) string("[") string(0x04)これで, X上では C-; を screen のプレフィクスとして使える。2行目〜3行目 は, screen の copy モードに入らなくても, M-C-{p,n} でバックスクロール するための設定。C-] でない人は, "0x1d" の部分を自分が使っているプレフィクス のコードに変更すればいけると思う。
#define LZS(i,j) (*(lzs + K * i + j))のようにマクロを定義して使っていたが, 家に帰って, 前にPCに保存しておいた C FAQ (fj.lang.c に定期的に流れていたもの) を読んでいたら, 以下のようなコードを書くと, matrix[i][j] でアクセスできることを知った。
/* dmatrix.h a header file of double matrix. $Id: dmatrix.h,v 1.1 2004/10/26 05:04:21 dmochiha Exp $ */ #ifndef __DMATRIX_H__ #define __DMATRIX_H__ extern double **dmatrix(int rows, int cols); #endif
/* dmatrix.c an implementation of double matrix. $Id: dmatrix.c,v 1.1 2004/10/26 05:04:20 dmochiha Exp $ */ #include <stdlib.h> #include "dmatrix.h" double ** dmatrix (int rows, int cols) { double **matrix; int i; matrix = (double **)malloc(rows * sizeof(double *)); if (matrix == NULL) return NULL; *matrix = (double *)malloc(rows * cols * sizeof(double)); // 中身を連続して malloc if (*matrix == NULL) return NULL; for (i = 1; i < rows; i++) matrix[i] = *matrix + i * cols; return matrix; }以下のように使う。
#include "dmatrix.h" double **matrix; if ((matrix = dmatrix(nrows, ncols)) == NULL) { fprintf(stderr, "cannot allocate matrix\n"); exit(1); } st = myclock(); for (i = 0; i < nrows; i++) for (j = 0; j < ncols; j++) matrix[i][j] = i + j; ed = myclock();ふむふむ, と思っていたが, コードを書いて調べてみると, 下のように 列ごとに malloc する方が速いようだ。えーーーー。;;
pxn:~/tmp/test% ./mdary 100 100 % 上の dmatrix を使った場合 elapsed = 0.000128 pxn:~/tmp/test% ./mdary2 100 100 % 列ごとに malloc する場合 elapsed = 0.000038 pxn:~/tmp/test% ./mdary 10000 1000 elapsed = 0.158179 pxn:~/tmp/test% ./mdary2 10000 1000 elapsed = 0.128347
タイトル一覧 |