Haskellまっとうなサイコロをふったときに出る目の確率は、こんな表にまとめられます。1/6こんな表のことを確率分布といいます。サイコロをふったときに起こるイベントの確率、たとえば「偶数の目が出る」確率を調べることは、この確率分布からこんな別の確率分布への変換だと考えられます。1/2この変換は、具体的にはこんな対応です。P(5)P(X)がイベントXに対する確率を表しているわけですが、Pを「イベントの集合から[0,1]区間の実数への関数」だとみなすこともできます。確率分布から確率分布への変換は、関数に対する演算でもあるわけです。確率分布を連想リストで表せば、高階関数や代数型を使って、この変換をモデル化できそうです。以前、このアイデアをSchemeで試してみたことがありました。当時は、そもそも確率についての理解が今よりもいっそうあやしかったし、実装もちゃちでしたが、このアイデアが特別なものでなかったことを最近になって知りました。Programming)。PFPと呼ばれているようです。Haskellのライブラリが公開されているので、これで遊んでみます。PFPでは、確率と確率分布をだいたいこんな感じに定義しています。Distribution)は連想リスト以外のなにものでもありません。例題をといてみましょう。次のような確率の問題を考えます。:)とあるロールプレイングゲームではモンスターを倒すと宝箱が得られます。間違った判定結果がでてしまいます。魔法をかけたら気配なしと判定された。このとき本当は罠がかかっている確率は?なにはともあれ、宝箱をあらわす型を用意します。宝箱は、罠がかかっているか、安全か。Safe問題文を読むと、2つの確率分布があたえられていることがわかります。罠がかかっている確率をあらわす分布と、判定魔法の結果をあらわす確率分布です。PFPには、イベントを列挙したリストと、それに対応する確率を列挙したリストとから確率分布を生成するための関数enumが用意されているので、これを使います。Trap]いずれの関数も、引数として受け取るのは目の前にある宝箱です。1回は罠がかかっているのに安全だと判定してしまいます。目の前にあるtreasureOfMonsterな宝箱にmagicSpellをかけてみましょう。2つの確率分布を組み合わせればいいのですが、magicSpellの結果は、とうぜん、treasureOfMonsterな宝箱に罠がかかっているかどうかで変化します。分布Bが分布Aに依存するというなら、分布Bそのものではなく、Aから分布Bへの関数を組み合わせればいい。Distがモナドであればいいということです。実際、PFPではそのように実装されています。こんなふうにすれば、モンスターの宝箱を魔法で調べた結果の確率分布が得られます。magicSpell試してみましょう。宝箱はなんでもいいので、undefinedを与えておきます。若干多い値であることから、誤判定で罠を見抜けない危険性のほうが、罠がないのに罠があると間違えてしまう可能性よりも影響が大きいようです。問題2に答えるために、罠がかかっているのに罠がないと判定してしまって死に至る確率を考えてみましょう。そのような事態はこんな演算として表せます。SafemagicSpellの結果とtreasureOfMonsterの結果のそれぞれに対して、このdeath演算を適用すれば、その一覧から死に至る確率がわかるでしょう。cという関数が用意されています。box)magicSpellに与えている引数がTrapなのは、ここで気にしている状況が「目の前にある宝箱に実際には罠がかかっている」場合だからです。魔法をかけるほうからすると、目の前にある宝箱がdeadか否かはわかりません。deadで評価する宝箱はundefinedです。6.7%宝箱を前にしてmagicSpellによる判定結果を盲信するというポリシーをつらぬくと、6.7%の確率で死んでしまうようです。問題2に戻りましょう。知りたいのは、magicSpellの判定結果で安全と出たときに、実際には罠がかかっていて死を招いてしまう確率です。Bayesの公式で解く場面です。「判定結果で安全と出る確率」も「死に至る確率」もわかっているので、これらの比率を求めれば答が得られます。Probabilityという型を持ちます。(|/)は、Probability型同士の確率の値について割り算をするために定義しました。infixを7にしたのは、??のinfixが8だからです。コンパイルして評価すれば問題2の答がわかります。あると、まだまだ気を抜けないようです。aがあって、いかにも条件つき確率の計算に使えそうだけど、確率分布からイベントの確率をfilterするようにしか見えない。そんな型で大丈夫か?)まとめHaskellとPFPを使うことで、確率の問題をうまく抽象化してエレガントに回答を導くことができます。この抽象化は、Haskellという言語の機能によるものではなく、確率論という数学によるものです。PFPにしても、特別なHaskellの機能はほとんど使っていないように思います(PFPには確率過程をシミュレーションする機能もあって、そちらはもしかしたら高度なHaskellの機能が満載かも)。そんな数学における抽象化をダイレクトにコードで使えることがHaskellの魅力のひとつなのはいわずもがな。数学では、抽象化が漏れて台無しにならないように、厳密な論証や独特の表記を使います。そのため、数学による問題の抽象化を利用するには、少し勉強や訓練が必要です。確率論は、漏れがないように抽象化された理論(公理的確率論とか呼ばれます)を勉強しようと思うと、高校までの数学経験だけではつまずいてしまう教材が多い。多少の漏れを棚に上げた感覚的な確率の話をもって「確率論」という教材もあって、それはそれでおもしろいとは思うのですが、抽象化の道具として使うにはちょっとねえ。そこでおすすめの教科書はこれ。『プログラミングのための確率統計』PDFでも買えますここまで読んだ貴徳な方なら、この記事の例題が『プログラミングのための確率統計』のものであることに気がついているかもしれません。具体的には53ページの例題2.7。この本に書いてある図を見れば、条件付き確率は一目瞭然です。確率分布や確率変数がとてもよくできた確率の問題の抽象化であることを実感できると思います。ために書いたものです。出版される前の本の内容は、通常は著者や編集者に代表される「制作サイド」の人間にしか読まれない。専門性の高い本であれば査読とか監修といったプロセスを有識者にお願いすることはあるけど、そうしたお願いをするときには有償だったりカバーや袖に名前を出したりすることが多いので、これも「...職務経歴書いろいろあって職務経歴書を作成してみることにしました。機能を使うのが一番お手軽です。編集をお手伝いしました。Blogger.自己紹介Unknown詳細プロフィールを。