- この処理を眺めてみる
- ベルヌーイ事象とその独立試行の繰り返しの話
- 二値型確率事象Bookをデータ型として作り、それに生起確率ベクトルを付け加えている。付け加えるときは、weightedという関数を使っている。有限事象の確率変数なのでFiniteというクラスを使っている
- 2試行をつなげるには、単に、タプルにしている。ただし、出来上がるものも有限事象確率変数なのでFiniteを使っている
- 多数回繰り返しは離散確率分布である Finite を要素とするベクトル
- 組み合わせ事象の確率計算は exact
- 条件を付けるときは condition関数を使った上で、bayes関数
module Main where
import Math.Probable
import qualified Data.Vector as V
data Book = Interesting
| Boring
deriving (Eq, Show)
bookPrior :: Finite d => d Book
bookPrior = weighted [ (Interesting, 0.2)
, (Boring, 0.8)
]
twoBooks :: Finite d => d (Book, Book)
twoBooks = do
book1 <- bookPrior
book2 <- bookPrior
return (book1, book2)
sampleBooks :: RandT IO (V.Vector Book)
sampleBooks = vectorOf 10 bookPrior
oneInteresting :: Fin (Book, Book)
oneInteresting = bayes $ do
(b1, b2) <- twoBooks
condition (b1 == Interesting || b2 == Interesting)
return (b1, b2)
main :: IO ()
main = do
print $ exact bookPrior
mwc sampleBooks >>= print
print $ exact twoBooks
print $ exact oneInteresting