学习在Julia中使用Mamba软件包

学习在Julia中使用Mamba软件包,julia,bayesian,sampling,montecarlo,Julia,Bayesian,Sampling,Montecarlo,我试图学习如何使用Julia中的Mamba包进行贝叶斯推理。虽然这个软件包很棒,但作为初学者,我发现文档中的信息有点匮乏。因此,我试图找出如何实现一些非常简单的示例 我尝试过的 我实现了一个对一元正态分布的平均值进行贝叶斯推断的示例。守则如下: using Mamba ## Model Specification model = Model( x = Stochastic(1, mu -> Normal(mu, 2.0), false ), mu = S

我试图学习如何使用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)
这似乎工作得非常好(尽管可能有更好的编码方法?)

我正在尝试做但不起作用的事情。

在这个例子中,我试图对二元正态分布的平均值进行贝叶斯推断。守则如下:

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
ERROR:MethodError:无法将{Float64,2}类型的数组对象`转换'为{Float64,1}类型的数组对象
这可能是由于调用构造函数数组{Float64,1}(…),
因为类型构造函数会退回到转换方法。
在setinits中!(::Mamba.arraystocastic{1},::Mamba.Model,::Array{Float64,2})位于/lhome/lgiannins/.julia/v0.5/Mamba/src/Model/dependent.jl:164
在setinits中!(::Mamba.Model,::Dict{Symbol,Any})位于/lhome/lgiannins/.julia/v0.5/Mamba/src/Model/initialization.jl:11
在setinits中!(::Mamba.Model,::数组{Dict{Symbol,Any},1})位于/lhome/lgiannis/.julia/v0.5/Mamba/src/Model/initialization.jl:24
在#mcmc#29(::Int64,::Int64,::Int64,::Bool,::Function,::Mamba.Model,::Dict{Symbol,Any},::数组{Dict{Symbol,Any},1},::Int64)at/lhome/lgiannins/.julia/v0.5/Mamba/src/Model/mcmc:29
在(::Mamba.#kw##mcmc)(::数组{Any,1},::Mamba.#mcmc,::Mamba.Model,::Dict{Symbol,Any},::数组{Dict{Symbol,Any},1},::Int64)at./:0

正如我在你打开的《曼巴》杂志上发布的那样:

问题在于

data[:x]
2x30 Array{Float64,2}:
是一个维数为2 x 30的矩阵。为x编码随机节点的方法是

 x = Stochastic(1,
    mu -> MvNormal(mu, eye(2)),
    false
  ),
它指定x是向量(维度为1的多维数组)。这就是随机后面的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)

请添加回溯(或至少添加错误消息),以便有人可以帮助您找到发生的情况。这一点很好。更新了上面的帖子。根据回溯,我猜你的一个条目的维度是错误的?我当然试着将声明“随机(1,…)”改为“随机(2,…”但是没有用。好吧,现在我想问题一定是我如何指定数据x。不幸的是,在Mamba文档中,我找不到一个将多元数据指定为分布结果的例子。谢谢,bdeonovic。一旦我们完成了Mamba问题页面上的讨论,我将更新这里的帖子。我已经更新了我对Github问题的回应。如果您还有任何问题,请告诉我!