Tuesday, March 17, 2009

Cygwin文字化け対策の覚書

メッセージの文字化けについて


シェルのメッセージの文字化け

export OUTPUT_CHASET=sjis
これではうまくいかないと書いてあるサイトもあるけど、いちおううまくいっているみたい

vimの文字化け


まだ解決していない

lessの文字化け


lvを使えばいいらしい

Tuesday, March 10, 2009

モンテカルロ法

正規化定数の不明な分布P(x)が与えられている。統計量A(x)の分布P(x)のもとでの期待値を求めたい。

定数Zについて
P(x)=\frac{\tilde{P}(x)}{Z}

となる~P(x)が書け、これが容易に計算できるものであるとする。

また、P(x)によく似た分布Q(x)があるとする。

  1. Q(x)からサンプルx_αを生成。
  2. A(x_α)と
    \omega^{(\alpha)}=\frac{\tilde{P}(x^{(\alpha)})}{Q(x^{(\alpha)})}
    を計算する。

期待値は、
\sum_x A(x)P(x)=\frac{\sum_{\alpha}A(x^{(\alpha)})\omega^{(\alpha)}}{\sum_{\alpha} \omega^{(\alpha)}}

具体例


円の面積を求めるモンテカルロ法では、P(x)が単位円の一様密度、Q(x)が外接する一辺2の正方形の中の一様密度、円の面積がZ。半径1の円の中にxがあるなら~P(x)=1、そうでなければ~P(x)=0、Q(x)も同様。
  1. 正方形の中の一点x_αをサンプリングする
  2. ω_α=~P(x)/Q(x)
  3. 連続変数なので期待値は

わっかんないな~

Friday, March 06, 2009

Box-Cox変換

なかなか正規化しない分布を無理やり正規化する方法。
λを用いてこんな変換をする
T(x)=\frac{x^{\lambda}-1}{\lambda}
MASSライブラリをロードし、
library(MASS)
box_par <- boxcox(y~x,lambda = seq(-0.25, 1, length = 100))
などとするとλの尤度が計算される。
p <- box_par$x[which.max(box_par$y)]
で、最尤推定量を取り出す。

Tuesday, March 03, 2009

TeX

これもすっかり忘れていたので。
platex **.tex
dvipdfmx **.dvi

って感じ

bloggerで数式

下の投稿で試したけど、ダッシュボード->レイアウト->HTMLの編集、で
<script type="text/javascript" src="http://tex.yourequations.com/"></script>

を、</body>の直前に挿入する。

そうすると、bloggerの投稿としてはHTMLの編集のところで
<pre lang="eq.latex">
f(x|\mu,\sigma)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{\sigma^2}}
</pre>

とかやると、

f(x|\mu,\sigma)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}


となる。素晴らしい。

ちなみにこれに気付く前はクリボウのページにあったスクリプトを使おうとしたんだけど、mimetexのサーバ使用制限でこれはすでに使えない。

混合正規分布

いまのところまったくわかっていません。とりあえず混合比
p_r
、成分分布(、というのは一般化した場合で、この場合正規分布)
h(x,\omega_r)
として

p_{mix}(x,\theta)=\sum_{r=1}^{R}p_r h(x,\omega_r)

と表わされるんだそうだ。そんで、ダミー変数Zを使って

Prob(Z=r)=p_r

X|Z=r \sim h(x,\omega_r)

(X,Z=r) \sim P_r h(x,\omega_r)

とすると、xが与えられた時のZ=rの条件付き密度が

p(Z=r|x,\theta)=\frac{p_r h(x,\omega_r)}{p_{mix}(x,\theta)}

となって、これがEMアルゴリズムに利用されるんだって。

RでCを使うとき

完全に忘れていたので覚書。ヘッダは
#include<R.h>
#include<Rdefines.h>

で、あと必要なもの。Rのベクトル変数はSEXPで指定。関数宣言は、
SEXP likelihood(SEXP InitComplex,SEXP scn,SEXP ssn1,SEXP ssn2,SEXP theta);

とすれば返り値もベクトルになる。このRのベクトル変数を引数でもらったときはメモリ確保が必要。
SEXP p;

PROTECT(ssn1=AS_INTEGER(ssn1));
PROTECT(ssn2=AS_INTEGER(ssn2));
PROTECT(theta=AS_NUMERIC(theta));
PROTECT(p=allocVector(REALSXP,muallele*2));

最後のは関数中で宣言したR形式ベクトル変数の領域確保。

これはreturnする前にかならず解放する。
UNPROTECT(4);
return p;

ソース作成したらコンパイルは、
R CMD SHLIB **.c

で、.soファイルと.oファイルができる。
Rからの読み込みは、
dyn.load("**.so")

で、関数呼び出しは、
.Call("関数名",引数)

とする。この場合の引数はRらしからぬ厳密な型(モード?)宣言が必要。as.numericなどを使用する。