mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2024年04月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

2005年09月06日(火) [n年日記]

#1 -

やっと理解できた。何日も悩んでいたので, 自分用メモというか, 公開デバッグ。

いま, 離散的なデータ θ = {θ1, ..., θn}が Dirichlet Process G ~ DP(α_0,G_0) に従っていたとする。
つまり, θ ~ G, i.i.d. n times.
このとき, n個のデータθが, 実際には k 個の違った値をとる確率 p(Z_n = k) が知りたい。(Z_n は n 個のデータのもつカテゴリの個数を表す 確率変数.)
例えば, θ = {{θ12},{θ345},{θ67}}とグループ分けされるとき, その確率は (α_0 = αと書くと)
1・1/(α+1)・α/(α+2)・1/(α+3)・2/(α+4)・α/(α+5)・1/(α+6) = 2・α^3/(α(α+1)‥(α+6)) = α^3・1^(2)/α^(7)
になる。ここで, x^(n) は raising factorial x(x+1)‥(x+n-1).

同様にして, n 個のデータが k 個に分かれるとすると, その partition のパターン を π(n,k) と書くと,
p(Zn = k) = Σi∈π(n,k) αk・f(i)/α(n) = αk(n)Σi∈π(n,k)f(i)= αk(n) c(n,k)
となる。ここで c(n,k) は n と k から決まる定数。
いっぽう, 第1種Stirling数 s(n,k) (reference) (Mathworld) を使うと, raising factorial x^(n) は
x^(n) = s(n,1) x + s(n,2) x^2 + .. + s(n,n) x^n
と展開できるので, 両辺を x^(n) で割って x = α とおくと, 1 = Σk=1n s(n,k) αk(n).
これを上の式と比べると,
p(Z_n = k) = s(n,k) αk(n)
となることがわかる。□
直接考えても, (Σi∈π(n,k)f(i))は (n個のデータをk個に分割する組み合わせの数) × (各partitionの中での円順列の数) なので, 第1種Stirling数の定義に従って これは s(n,k) に等しい,ということにバスの中で気付いた。


2004年09月06日(月) [n年日記]

#1 cvs import

普通に cvs import すると, デフォルトではイニシャルブランチ 1.1.1.1 ができて しまうので,
  1. /tmp に空ディレクトリを作り, 一旦そこに cd して空のモジュールを作る
  2. そこ(あるいは別の場所)で cvs checkout module し, module/CVS を元の作業 ディレクトリに mv する
  3. 空ディレクトリを消す
  4. 元の作業ディレクトリで, cvs add *; cvs commit * する
という手順を(手で)順番にやっていた。こうすると普通にリビジョンが 1.1 から 始まるし, 必要なファイルだけ add できるのでムダがない。(聞いたところ, こうして 1.1.1.1 を避けるのはそんなにレアというわけではないらしい)

毎回これを手でやるのは面倒なので, スクリプトを書いてみた。以下のような感じ。

#!/bin/sh -
#
#  cvsinit -- cvs initial importer.
#
# $Header: /home/dmochiha/cvsroot/scripts/cvsinit,v 1.2 2004/09/06 06:17:54 dmochiha Exp $
if [ $# -lt 1 ]; then
        echo "usage: cvsinit module [initial message]"
        exit 0
fi
CVSMOD=$1
CVSMSG=${2:-"cvs start"}
CVSSTART=start
OLDPWD=`pwd`
trap 'rm -rf /tmp/.cvsinit-$$; exit 1' 2 3 9 15
(mkdir /tmp/.cvsinit-$$; \
 cd    /tmp/.cvsinit-$$; \
 cvs import -m "$CVSMSG" $CVSMOD `whoami` $CVSSTART; \
 cvs checkout $CVSMOD;   \
 mv $CVSMOD/CVS $OLDPWD  \
)
rm -rf /tmp/.cvsinit-$$
"cvs start" とかベンダが `whoami` なのは自由なので, 適当に書き換えて下さい。
今いるディレクトリで cvsinit foo とやると, 空のモジュール foo ができて 今のディレクトリが CVS の管理下に入るので、そこで必要なファイルを適当に cvs add; cvs commit すればよい。(実際には僕は cvsadd () { cvs add $*; cvs commit $* } という関数を ~/.zshrc で定義しています。)
イニシャルブランチを使うのが気にならない人は別にいいのだけど, 1.1.1.1 が気に なる人や, *.c や *.m など必要なファイルだけ管理したい人にはおすすめだと思う。
(Thanks for the help of F澤さん。)

#2 -

先週は1週間ずーっと手計算していたので, メモがすごいことになっている。; 整理 しないと。


2 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project