大数の法則
ここでは無限にたくさんサンプルをとったら収束するという感じの解釈。
- 数列$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")[:]
このノートでは上から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として採用している。(正規分布近似)
- 参考: TheMostDangerousEquation: PDFへのリンク