gpt4 book ai didi

用于从标准概率分布中采样的 Haskell 包

转载 作者:行者123 更新时间:2023-12-04 18:18:47 27 4
gpt4 key购买 nike

我想在 Haskell 中做一些蒙特卡洛分析。我希望能够编写这样的代码:

do n <- poisson lambda
xs <- replicateM n $ normal mu sigma
return $ maximum xs

这对应于随机模型
n ~ Poisson(lambda)
for (i in 1:n)
x[i] ~ Normal(mu, sigma)
y = max_{i=1}^n x[i]

我可以很容易地看到如何创建必要的随机采样单子(monad)。但是,我宁愿不必为所有标准概率分布实现采样器。是否有已经实现这些的 Haskell 包?

我看过包 random-fu ,在0.2.7版本停滞了三年,但我无法理解;它取决于类型类 MonadRandomRandomSource ,没有很好的解释。

我还查看了包 mwc-probability ,但我也无法理解——看来您必须已经了解 PrimMonadPrimState类型类。

这两个包都让我觉得 API 过于复杂,并且似乎完全放弃了在 System.Random 中找到的 Haskell 的标准随机数生成框架。 .

任何意见,将不胜感激。

最佳答案

好吧,如果您希望能够编写这样的代码:

do n <- poisson lambda
xs <- replicateM n $ normal mu sigma
return $ maximum xs

那么你大概想使用 random-fu :
import Control.Monad
import Data.Random
import Data.Random.Distribution.Poisson
import Data.Random.Distribution.Normal

foo :: RVar Double
foo = do
n <- poisson lambda
xs <- replicateM (n+1) $ normal mu sigma
return $ maximum xs

where lambda = 10 :: Double
mu = 0
sigma = 6

main :: IO ()
main = print =<< replicateM 10 (sample foo)

我不确定过去三年缺乏更新是否应该是决定性因素。 Gamma 分布领域真的有那么多令人兴奋的进步吗?

实际上,它看起来像 mwc-probability工作原理相同:
import Control.Monad
import System.Random.MWC.Probability

foo :: Prob IO Double
foo = do
n <- poisson lambda
xs <- replicateM (n+1) $ normal mu sigma
return $ maximum xs

where lambda = 10 :: Double
mu = 0
sigma = 6

main :: IO ()
main = do
gen <- createSystemRandom
print =<< replicateM 10 (sample foo gen)

关于用于从标准概率分布中采样的 Haskell 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56084779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com