読者です 読者をやめる 読者になる 読者になる

下校時刻

メモ、読んだ本のまとめメモ、考えたことのメモ、その他のメモなどが書いてあるブログです(twitter: @hoture6)

『Bayesian Methods For Hackers』Ch. 4 まとめ

Ch. 4です。


大数の法則

ある一つの確率分布からサンプルした独立な確率変数の平均は、サンプル数$N$が増えるにつれてその期待値に収束する。

$$\frac{1}{N} \sum_{i}^{N} Z_i \to E[Z] \ (N \to \infty)$$

収束の速度は確率変数$Z$の分散$V(Z)$に依存し、期待値からのずれの期待値(?(!))は

$$E\left[ \sqrt{ \left( \frac{1}{N} \sum_{i}^{N} Z_i - E[Z] \right)^{2}} \right] = \sqrt{\frac{V(Z)}{N}}$$

である。すなわち、分散が大きい変数ほど収束が遅い(そりゃそうじゃ)。

また、Nが小さい時には大数の法則は適用できない(そりゃそうじゃ2)。

Redditではコメントにupvoteとdownvoteができ、そこから決まるコメントの価値順にコメントがソートされている。それでは、コメントの価値をどう決めれば良いのか?

  • upvote数
  • upvote数 - downvote数
  • (upvote数 - downvote数) / 投稿からの時間
  • upvote数 / (upvote数 + downvote数)

どれも長所・短所があるけど、シンプルに考えると結局一番よくコメントの価値を表していそうなのは

  • 真の(隠された)upvote数 / (upvote数 + downvote数)

なので、これをベイズ推定するというアプローチがいい(なるほど〜)。

ちなみに、これは観測されたupvote数 / (upvote数 + downvote数)とは違うので注意。対数の法則によりvote数が無限だと2つの値は一致するけど、実際は無限でないどころかvote数はかなり小さいことが多い。

そのためベイズ推定をする。具体的には、各コメントごとのupvoteの確率$p$をMCMCでサンプルする。pでソートしてコメントの価値が高い順に並べたいんだけど、サンプルの平均値で並べ換えるのは良くない。もっと安全なのは、95%信頼区間の下限値でソートすることだ(なるほど〜2)。95%信頼区間の下限値でのソートは、以下の望ましい性質を満たす。

  1. 実際のupvote数 / (upvote数 + downvote数)が同じ2つの質問があった場合、voteの総数が大きい方が価値が高くなる
  2. voteの総数が同じ2つの質問があった場合、upvote数が多い方が価値が高くなる

(平均値でソートしてしまうと1の性質が満たされない(こんな感じで事前に満たされてほしい性質を考えておくのが重要っぽい))

ちなみに実際の場合、いちいちMCMCするのは悲しいので、upvote数とdownvote数を入力として近似的な95%信頼区間の下限値を出力する式が存在するのでそれを使うと良い。