首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习使用Julia中的Mamba包

学习使用Julia中的Mamba包
EN

Stack Overflow用户
提问于 2016-09-23 12:39:44
回答 1查看 595关注 0票数 4

我正在学习如何使用Julia中的Mamba包进行贝叶斯推理。虽然这个包很棒,但作为初学者,我发现文档中的信息有点缺乏。因此,我试图找出如何实现一些非常简单的例子。

我已经尝试过的

我实现了一个例子,用于对单变量正态分布的均值进行贝叶斯推断。守则如下:

代码语言:javascript
复制
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)

这看起来非常好(虽然可能有更好的方法来编写这个代码?)。

我想做的和不成功的事情。

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

代码语言:javascript
复制
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文档。谢谢。

增编:错误消息

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 22:07:40

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

问题是因为

代码语言:javascript
复制
data[:x]
2x30 Array{Float64,2}:

是维数2x30的矩阵。对x的随机节点进行编码的方式是

代码语言:javascript
复制
 x = Stochastic(1,
    mu -> MvNormal(mu, eye(2)),
    false
  ),

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

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39660999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档