【问题标题】:Learning to use the Mamba package in Julia学习在 Julia 中使用 Mamba 包
【发布时间】:2017-02-01 07:51:43
【问题描述】:

我正在尝试学习如何使用 Julia 中的 Mamba 包进行贝叶斯推理。尽管该软件包很棒,但作为初学者,我发现文档的信息有点稀缺。因此,我试图弄清楚如何实现一些非常简单的示例。

我的尝试

我实现了一个示例,用于对单变量正态分布的均值进行贝叶斯推理。代码如下:

using Mamba

## Model Specification

model = Model(

  x = Stochastic(1,
    mu -> Normal(mu, 2.0),
    false
  ),

  mu = Stochastic(
    () -> Normal(0.0, 1000.0),
    true
  )

)

## Data
data = Dict{Symbol, Any}(
  :x => randn(30)*2+13
)

## Initial Values
inits = [
  Dict{Symbol, Any}(
    :x => data[:x],
    :mu => randn()*1
  )
]

## Sampling Scheme Assignment
scheme1 = NUTS([:mu])
setsamplers!(model, [scheme1])

sim1 = mcmc(model, data, inits, 10000, burnin=250, thin=2, chains=1);
describe(sim1)

这似乎工作得很好(尽管可能有更好的编码方法?)。

我正在尝试做的事情却没有用。

在此示例中,我尝试对二元正态分布的均值进行贝叶斯推断。代码如下:

using Mamba

## Model Specification

model = Model(

  x = Stochastic(1,
    mu -> MvNormal(mu, eye(2)),
    false
  ),

  mu = Stochastic(1,
    () -> MvNormal(zeros(2), 1000.0),
    true
  )

)

## Data
data = Dict{Symbol, Any}(
  :x => randn(2,30)+13
)

## Initial Values
inits = [
  Dict{Symbol, Any}(
    :x => data[:x],
    :mu => randn(2)*1
  )
]

## Sampling Scheme Assignment
scheme1 = NUTS([:mu])
setsamplers!(model, [scheme1])

sim1 = mcmc(model, data, inits, 10000, burnin=250, thin=2, chains=1);
describe(sim1)

您可能会注意到,我认为必要的更改很少。但是,我在某个地方做错了,当我尝试运行它时,我得到一个错误(类型之间的转换错误),这对我没有进一步的帮助。

任何帮助表示赞赏。如果这可行,我会考虑将这个简单的示例贡献给其他新用户的 Mamba 文档。谢谢。

附录:错误信息

ERROR: MethodError: Cannot `convert` an object of type Array{Float64,2} to an object of type Array{Float64,1}
This may have arisen from a call to the constructor Array{Float64,1}(...),
since type constructors fall back to convert methods.
 in setinits!(::Mamba.ArrayStochastic{1}, ::Mamba.Model, ::Array{Float64,2}) at /lhome/lgiannins/.julia/v0.5/Mamba/src/model/dependent.jl:164
 in setinits!(::Mamba.Model, ::Dict{Symbol,Any}) at /lhome/lgiannins/.julia/v0.5/Mamba/src/model/initialization.jl:11
 in setinits!(::Mamba.Model, ::Array{Dict{Symbol,Any},1}) at /lhome/lgiannins/.julia/v0.5/Mamba/src/model/initialization.jl:24
 in #mcmc#29(::Int64, ::Int64, ::Int64, ::Bool, ::Function, ::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at /lhome/lgiannins/.julia/v0.5/Mamba/src/model/mcmc.jl:29
 in (::Mamba.#kw##mcmc)(::Array{Any,1}, ::Mamba.#mcmc, ::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at ./<missing>:0

【问题讨论】:

  • 请添加回溯(或至少是错误消息),以便有人可以帮助您找到发生了什么。
  • 好点。更新了上面的帖子。
  • 鉴于回溯,我猜您的其中一个条目的尺寸有误?
  • 我当然尝试将声明“Stochastic(1,...”更改为“Stochastic(2,...”),但无济于事。
  • 好的,现在我认为问题必须在我如何指定数据 x 上。不幸的是,在 Mamba 文档中,我找不到将多元数据指定为分布结果的示例。

标签: julia bayesian sampling montecarlo


【解决方案1】:

正如我在您打开的 Mamba 问题上发布的那样:

问题是因为

data[:x]
2x30 Array{Float64,2}:

是一个维度为 2 x 30 的矩阵。您为 x 编码随机节点的方式是

 x = Stochastic(1,
    mu -> MvNormal(mu, eye(2)),
    false
  ),

指定 x 是一个向量(维数为 1 的多维数组)。这就是 Stochastic 后面的 1 所表示的。它有助于用数学符号写出模型。因为 MvNormal 定义了向量上的分布,而不是矩阵。也许您的模型类似于 X_1, ..., X_n iid MvNormal(mu, I) 在这种情况下您可以尝试类似的东西

using Mamba

## Model Specification

model = Model(
  x = Stochastic(2,
    (mu, N, P) ->
      UnivariateDistribution[
      begin
        Normal(mu[i], 1)
      end
      for i in 1:P, j in 1:N
    ],
    false
  ),
  mu = Stochastic(1,
    () -> MvNormal(zeros(2), 1000.0),
    true
  )
)

## Data
data = Dict{Symbol, Any}(
:x => randn(2,30)+13,
:P => 2,
:N => 30
)
## Initial Values
inits = [
  Dict{Symbol, Any}(
    :x => data[:x],
    :mu => randn(2)*1
  )
]

## Sampling Scheme Assignment
scheme1 = NUTS([:mu])
setsamplers!(model, [scheme1])

sim1 = mcmc(model, data, inits, 10000, burnin=250, thin=2, chains=1);
describe(sim1)

【讨论】:

  • 谢谢,bdeonovic。一旦我们在 Mamba 问题页面上完成讨论,我将在此处更新帖子。
  • 我已经更新了我对 Github 问题的回复。如果您还有问题,请告诉我!
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 2020-11-22
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多