wvogel日記

自分用の技術備忘録が多めです.

確率変数

今日は久々にHaskell触った。
実際はこれから明日の分の課題を片していかないといけないわけですが....
今日講義で扱った、
確率変数が非負整数のときの確率の期待値の計算方法。

値が離散的な場合、よく知られているようにその期待値は、

(i=0 → N)Σ(xi * P(xi))    --i番目の値xが出る確率をP(x)としている

で計算出来ますが、特に非負という条件が付くと、

(k=0 → N)ΣP(xi | i > k)

として計算できます。


これをHaskellで書いてみた

簡単に、さいころをふる場合で考える
expectValueが通常の期待値の計算、
expectValue'が、二つ目の計算方法によるもの。

module Dice where

dice :: [(Int,Double)]
dice = zip [1..6] $ repeat (1/6)

expectValue :: Double
expectValue = sum $ map f dice
  where
    f (a,b) = b* fromIntegral a

expectValue' :: [Double] -> Double
expectValue' [] = 0
expectValue' [p] = p
expectValue' r  =  (sum r + sum r') + expectValue' (tail r')
  where
    r' = tail r

実行結果

> expectValue
3.5
> expectValue' $ take 6 $ repeat (1/6)
3.4999999999999996

こんな感じになりました。