2016-09-23 2 views
3

J'essaie d'apprendre à utiliser le paquet Mamba dans Julia pour faire des inférences bayésiennes. Bien que le paquet soit génial, en tant que débutant je trouve la documentation un peu rare en information. Par conséquent, j'essaie de comprendre comment mettre en œuvre des exemples très simples.Apprendre à utiliser le paquet Mamba dans Julia

Ce que j'ai essayé

I mis en œuvre un exemple pour faire l'inférence bayésienne pour la moyenne d'une distribution normale univariée. Le code suivant:

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) 

Cela semble fonctionner tout à fait bien (mais il peut y avoir de meilleures façons de coder peut-être cela?). Ce que j'essaie de faire et ne fonctionne pas.

Dans cet exemple, j'essaie de faire une inférence bayésienne pour la moyenne d'une distribution normale bivariée. Le code suit:

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) 

Comme vous pouvez le remarquer, les changements que je suppose nécessaires sont minimes. Cependant, je fais quelque part quelque chose de mal et quand j'essaye d'exécuter ceci j'obtiens une erreur (une conversion entre les types erreur) qui ne m'aide pas plus loin.

Toute aide appréciée. Si cela fonctionne, je vais envisager de contribuer cet exemple simple à la documentation Mamba pour d'autres nouveaux utilisateurs. Merci.

Addendum: le message d'erreur

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 
+0

S'il vous plaît ajouter le retraçage (ou au moins le message d'erreur) pour que quelqu'un puisse vous aider à trouver ce qui se passe. –

+0

bon point. Mise à jour post ci-dessus. – user1438310

+0

étant donné le retraçage, je suppose que l'une de vos entrées a les mauvaises dimensions? –

Répondre

1

Comme je l'ai posté sur la question Mamba vous openned:

La question est parce que

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

est une matrice de dimension 2 x 30. La façon dont vous avez codé le nœud stochastique pour x est

qui spécifie que x est un vecteur (tableau multidimensionnel de dimension 1). C'est ce que dénote le 1 juste après le stochastique. Cela aide à écrire le modèle en notation mathématique. Parce que le MvNormal définit une distribution sur un vecteur, pas une matrice. Peut-être que votre modèle est quelque chose comme X_1, ..., X_n IID MvNormal (mu, I), dans ce cas, vous pouvez essayer quelque chose comme

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) 
+0

Merci, bdeonovic. Je vais mettre à jour le post ici une fois que nous aurons terminé notre discussion sur la page des problèmes de Mamba. – user1438310

+0

J'ai mis à jour ma réponse sur le problème de Github. Faîtes moi savoir si vous avez d'autres questions! – bdeonovic