2007-11-26 [長年日記]
λ. 「ガン検診」問題でPRISMを試す
一階述語論理と確率を統合したツールとしてPRISMというものがある。
前々から存在は知っていたけど、最近渕一博記念コロキウム『論理と推論技術:四半世紀の展開』(20071020)の「記号的統計モデリングの世界を探る」(佐藤泰介)という発表を聴き、また「コンピュータソフトウェア」(Vol. 24 No. 4 Oct. 2007)に載っていた「PRISM: 確率モデリングのための論理プログラミング処理系」(亀谷由隆, 佐藤泰介, 周能法, 泉祐介, 岩崎達也)を読んで面白かったので、ちょっと試してみようと思った。
まずは非常に簡単な例として、ベイズのルールの例としてよく出てくるガン検診の例を試してみる。 以下は、昔受講した井庭先生の「探索的モデリング」(2004年度)の第3回「ベイズ確率 reloaded」より引用。
あるガン検診の方法は、ガンの人は0.95の確率でガン陽性と診断され、健康な人がガン陽性と誤診される確率は0.05だとする。(つまり、どちらにしても的中率95%) ガンにかかる確率を0.005とする。この検査の結果、「ガン陽性である」という診断がでたら、自分のガンの可能性をどの程度と疑うべきだろうか?
これをPRISMでモデル化すると以下のようになる。
% cancer.psm target(p/2). % 確率事象を表現する述語の宣言 values(cancer, [t, f]). % 確率変数cancerのとる値 values(test(_), [positive, negative]). % 確率変数test(_)のとる値 p(CANCER, RESULT) :- msw(cancer, CANCER), % CANCERは確率変数cancerの値 msw(test(CANCER), RESULT). % RESULTは確率変数test(CANCER)の値 % 確率分布の設定 :- set_sw(cancer, [0.005, 0.995]). :- set_sw(test(t), [0.95, 0.05]). :- set_sw(test(f), [0.05, 0.95]).
これをPRISMに読み込ませて、「ガン陽性である」という診断が出たときに実際にガンである確率(事後確率)を計算してみる。
[sakai@localhost ~]% prism PRISM 1.11.1, Sato Lab, TITECH, All Rights Reserved. Nov 2007 B-Prolog Version 7.0, All rights reserved, (C) Afany Software 1994-2007. Type 'prism_help' for usage. | ?- prism(cancer). prism(cancer). compiled in 0 milliseconds loading::cancer.psm.out yes | ?- chindsight_agg(p(_, positive), p(query, _)). chindsight_agg(p(_, positive), p(query, _)). conditional hindsight probabilities: p(f,*): 0.912844036697248 p(t,*): 0.087155963302752 yes | ?-
事後確率が計算され、実際にガンである確率が約9%、実際にはガンでない確率が約91%という結果が得られる。 つまり、このモデルだと、ガンと診断されても実際にはガンでない可能性の方が遥かに高いわけですね。
うん、確かに非常に手軽に色々出来そうだ。 というか、確率推論や確率の学習を行うだけなら、探索的モデリングの授業で使ったBayonetよりもずっと手軽そうだ。 グラフ構造を推定したりしたいような場合には使えないとは思うけど。
λ. Re: EXPTIME とか PSPACE とか
あろはさんのホワット・ア・ワンダフル・ワールド 真面目に計算の複雑性の理論を勉強してこなかったツケがより。
非常にわかりやすくて、勉強になる。交替性有限オートマトン(Alternating Finite Automata, AFA)にはお世話になっているけど、交替性チューリング機械なんてのも存在して、計算量理論で意味を持っていたとは。
ちなみに、SFCでは [Chandra-Kozen-Stockmeyer] を教えてくれるどころか、計算量理論を扱う授業自体が無かった…… orz