Haskellでgtk+でプロット

  • ハスケルプでの統計的プロットは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
  --print results
  putStrLn $ show' results
stack exec hoge-exe > out.txt
R
d <- as.matrix(read.table("out.txt"))
hist(d)