- ハスケルプでの統計的プロットはRでやることにするほうが良さそう(こちら)
- 以下のような混合正規乱数発生の場合は、Doubleのリストを作り、それのブランケット [] を外してタブ区切り文字列にして
- テキストファイルにする
- それをRから読み込んで hist() する
import Data.Random
import Data.Random.Distribution.Dirichlet
import Data.Random.Distribution.Exponential
import Data.Random.Distribution.Categorical
import Data.List
import System.IO
gaussianMixtureModel :: [Double]
-> [(Double, Double)]
-> RVar Double
gaussianMixtureModel weights params = do
let gs = map (\(mu, sigma) -> normal mu sigma) params
selected <- categorical $ zip weights gs
selected
show' :: Show a => [a] -> String
show' = intercalate "\t" . map show
main :: IO ()
main = do
results <- sample $ do
weights <- dirichlet [1, 1]
params <- sequence $ replicate (length weights) $ do
mu <- normal 0 10
sigma <- exponential 1
pure (mu, sigma)
sequence $ replicate 10000 $ gaussianMixtureModel weights params
putStrLn $ show' results
stack exec hoge-exe > out.txt
R
d <- as.matrix(read.table("out.txt"))
hist(d)