naoya_t@hatenablog

いわゆるチラシノウラであります

自然言語処理とlogの底と

言語処理のための機械学習入門」(奥村学 著)の演習問題なんかを題材にPython絶賛入門中なのですが、演習問題の答えの値(具体的には§4.6.1の例題4.15のPMI*1の値)が自分の計算と違うからなんでだろう誤植かなあ(この本時々あるし)と思ってよくよく見てみると数値が全て約1.44倍ぐらいになってて、1.44て何の定数だろう?と思ってちょっと考えてたら

\frac{\log e}{\log 2}=\log_2e=1.442695...

じゃないか…logの底を2で計算したら確かに本に書いてある通りの値になる...そうかこの本でlogって底が2なんだ(今さら気がついた)

PRMLでも§1.6で

対数の底の選び方には自由度があり、ここでは情報理論で一般に使われている底2を採用することにする。この場合、以下で見るように h(x) の単位は「ビット」(bit, binary digits) である。

パターン認識と機械学習 上 - ベイズ理論による統計的予測

って言ってたのを思い出した。(上巻pp.48-49)

上式中の対数 (log) の底として何を選んでも、情報量の値が定数倍変わるだけなので、本質的な差はないものの、底としては2を選ぶことが多い。
底が2の場合、\frac1{2^n}の確率で起こる事象の情報量はnである。

情報量 - Wikipedia

「言語処理のための機械学習入門」ではどこに書いてあったか(書いてあるのか)思い出せないけどまあ、情報量は2底のlogで。ちぃ、覚えた

ところで、C言語でも他の言語でも、ネイピア数 e = 2.71828.. を底とする自然対数を求める log(x) の他に、2 を底とする対数を求める log2(x) がある。(無かったとしても log(x)/log(2) で求められるけど)
さっき1億回ぐらい試してみたけど、C言語で見る限りどっちが速いとか特になさそうだ。

1億回回るつもりのループが最適化で回ってなかったりとかあるので、念のため gcc -S したりobjdump -dS したりしてみた結果 -O0 なら大丈夫と知ったのは別の物語。比較用に log(128.0) と log2(128.0) で比べてて log2 の方が断然速い!とか一瞬思ったけどそれは128=2^7ちょうどで計算がすぐに収束しちゃうからだよね・・・適当な乱数でテストしたらやっぱりほとんど同じだったのだよ…