tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

「Probabilistic Programming and Bayesian Methods for Hackers」を読んだ - (4章)

4章は大数の法則大数の法則にまつわる注意点について。

大数の法則

ここでは無限にたくさんサンプルをとったら収束するという感じの解釈。

  • 数列$a_{n}$と分布の平均$\mu$から平均からの距離を$D(N) = \sqrt{E[(\dfrac{1}{N} \sum a_{i} - \mu)^{2}]}$とすると、$D(N) \approx \dfrac{var(A)}{\sqrt{N}}$らしい。
  • 10倍精度よく収束させようとすると100倍くらい計算しないといけないことになるのでトレードオフということ。
  • 分散が大きい場合はうまく行きにくいことも示唆している。
  • 小さい数には大数の法則は適応できない←当たり前だが忘れがち

例: Redditはてなスターのレーティングシステム

いろいろなトピックやコメントを有意義な順番にソートしたい。単純に良いね/良くないねの比率や差で計算することにすると投票数が少ないものに有利すぎる。また、大数の法則から投票数が多いものは適切な比率へと収束していくが、投票数が少ないものは極端な値になりやすい。真の評価値の分布を調べ、その分布をもとに適切な基準を選びソートしてやることでこれらの問題を回避できる。(分布はそのままではソートできない。)

と考えられる。そこでredditは0,1、はてなスターは0,1/3,2/3,1とそれぞれ割り当てて考える。以下はredditについて考える。

def post_favrate(upvote, downvote, samples=20000):
    favrate = pm.Uniform("favrate", 0, 1)
    upvote_ratio = pm.Binomial("upvote_ratio", favrate, value=upvote/(upvote+downvote), observed=True)
    map = pm.Map([favrate, upvote_ratio]).fit()
    mcmc = pm.MCMC([favrate, upvote_ratio])
    mcmc.sample(samples, samples/4)
    return mcmc.trave("favrate")[:]

f:id:kuyata:20140822200146p:plain

このノートでは上から95%分位点の値をソートの比較用の尺度として採用している。

np.sort(posterior)[posterior.shape[0]//20]

これではソートしないといけない対象が多くなった時に破綻するので$\dfrac{a}{a+b} \pm 1.65\sqrt{\dfrac{ab}{(a+b)^{2}(a+b+1)}}$を90%CIとして採用している。(正規分布近似)