PHPでベイズ推定の習作
今更ながら、ポールグレアムの有名な本を読んだ。
ハッカーと画家 コンピュータ時代の創造者たち
ベイジアンフィルタの作り方が書いてあった。
フィルタの作り方についてはよく理解できてなかったのだが(文系だし)、「あー思ったより簡単なのだな」ということはなんとなく分かったので、PHPで習作してみることに。
ただ本だけでは理解不足な部分もあったので、以下も参考。
Implement Bayesian inference using PHP, Part 1
ベイズ推定 - Wikipedia
ベイジアンフィルタ
ベイジアンってどういう考え方なんだろう
整理の為に簡単なのを書いてみると、
例えば、とあるシステム会社があって、
・男が60%、女が40%
・男のウチ、99% がアニヲタ
・女のウチ、10% がアニヲタ
の場合、アニヲタだったとき、それが男の可能性は、
((0.6 x 0.99 ) / (( 0.6 x 0.99) + (0.4 x 0.1)) = 0.93
ってことで、なにもしなければ男の確率は60%だったのだが、アニヲタという条件を加えたことにより野郎率が変わるのを定理化したのがベイズの定理。
という理解でいいのかな。
何のことはない確率の比を取っているだけである。
なので大体あっている気がするが。
ベイズ推定習作
ロジックとかはPaul Graham方式を参考にしてみたのだけど、本当は 偽陽性(false positive)・・・スパムじゃないのにスパムと判断されるのを防ぐ為に、Goodの確率を2倍にしたりとか、もう少し係数とか条件が増えてます。
このへんは判定すべき事象(「褒めている文章かDISっている文章か」とか)によって変わってくるチューニング事項なのかなぁ、って気がします。
で、ソースはこんな感じ。
-
<?php
-
-
$gpp = false;
-
-
foreach ($_POST['g'] as $row) {
-
if ($v != '') {
-
$g[] = $v;
-
}
-
}
-
foreach ($_POST['b'] as $row) {
-
if ($v != '') {
-
$b[] = $v;
-
}
-
}
-
-
foreach($gw as $row) {
-
}
-
$tbl[$row]['g']++;
-
}
-
-
foreach($bw as $row) {
-
}
-
$tbl[$row]['b']++;
-
}
-
-
foreach($tbl as $k=>$v) {
-
$tbl[$k]['gpp'] = ($tbl[$k]['gp'] / ($tbl[$k]['gp']+$tbl[$k]['bp']));
-
}
-
-
$gp = $bp = 1;
-
foreach ($cw as $row) {
-
continue;
-
}
-
$gp *= $tbl[$row]['gpp'];
-
$bp *= (1 - $tbl[$row]['gpp']);
-
$res[$row] = $tbl[$row];
-
}
-
$gpp = $gp / ($gp+$bp);
-
}
-
?><html>
-
<head>
-
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-
</head>
-
<body>
-
<h1>bayes</h1>
-
<form method="POST" action="index.php">
-
<table border="2">
-
<tr><td>Good Sentence</td><td>Bad Sentence</td></tr>
-
<?php
-
for ($i=0;$i<10;$i++) {
-
?>
-
<tr>
-
<td><input type="text" name="g[]" value="<?php echo $gv; ?>" size="50"/></td>
-
<td><input type="text" name="b[]" value="<?php echo $bv; ?>" size="50"/></td>
-
</tr>
-
<?php
-
}
-
?>
-
</table>
-
Check Sentence<br />
-
<input type="text" name="c" value="<?php echo $cv; ?>" size="100" /><br />
-
<input type="submit" name="e" />
-
</form>
-
<?php
-
if ($gpp !== false) {
-
?>
-
<hr />
-
<br />
-
<pre>
-
total:
-
words:
-
<?php
-
}
-
?>
-
</body></html>
TrackBack URL :
Comments (1)
[...] PHPでベイズ推定の習作 | 眠る開発屋blog [...]
ピンバック by 怒涛のめもめもリンク集 | 一時リンク — 2009/8/24 月曜日 @ 13:08:17