Mamba.jl
Mamba.jl copied to clipboard
Cannot use Distributions.MixtureDistribution for Stochastic variable
Problem appears upstream to Distributions.jl, see https://github.com/JuliaStats/Distributions.jl/issues/650
The following code:
using Mamba
dist = MixtureModel([
MvNormal([0,0], hcat([[1,0.99],[0.99,1]]...)),
MvNormal([-.8,.8], hcat([[1,0.75],[0.75,1]]...))
])
model = Model(
x = Stochastic(1,
() -> dist
),
)
inits = [
Dict{Symbol,Any}(:x => [0,0])
for i in 1:3
]
scheme = [HMC(:x, 0.03, 10, hcat([[1,0],[0,1]]...))]
setsamplers!(model, scheme)
sim = mcmc(model, Dict{Symbol,Any}(), inits, 100)
Generates the stacktrace:
MethodError: no method matching insupport(::Distributions.MixtureModel{Distributions.Multivariate,Distributions.Continuous,Distributions.MvNormal{Float64,PDMats.PDMat{Float64,Array{Float64,2}},Array{Float64,1}}}, ::Array{Float64,1})
Closest candidates are:
insupport(::Distributions.Dirichlet, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/dirichlet.jl:149
insupport(::Distributions.Multinomial, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/multinomial.jl:130
insupport(::Distributions.DirichletMultinomial, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/dirichletmultinomial.jl:51
...
Stacktrace:
[1] logpdf_sub(::Distributions.MixtureModel{Distributions.Multivariate,Distributions.Continuous,Distributions.MvNormal{Float64,PDMats.PDMat{Float64,Array{Float64,2}},Array{Float64,1}}}, ::Array{Float64,1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/distributions/distributionstruct.jl:139
[2] logpdf(::Mamba.ArrayStochastic{1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/dependent.jl:212
[3] logpdf(::Mamba.Model, ::Array{Symbol,1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:63
[4] logpdf!(::Mamba.Model, ::Array{Float64,1}, ::Int64, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:82
[5] finite_difference!(::Mamba.##38#39{Mamba.Model,Int64,Bool}, ::Array{Float64,1}, ::Array{Float64,1}, ::Symbol) at /Users/feynman/.julia/v0.6/Calculus/src/finite_difference.jl:112
[6] finite_difference at /Users/feynman/.julia/v0.6/Calculus/src/finite_difference.jl:145 [inlined]
[7] gradient at /Users/feynman/.julia/v0.6/Calculus/src/derivative.jl:13 [inlined]
[8] #gradlogpdf!#37 at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:50 [inlined]
[9] (::Mamba.#kw##gradlogpdf!)(::Array{Any,1}, ::Mamba.#gradlogpdf!, ::Mamba.Model, ::Array{Float64,1}, ::Int64, ::Bool) at ./<missing>:0
[10] logpdfgrad!(::Mamba.SamplingBlock, ::Array{Float64,1}, ::Symbol) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/sampler.jl:108
[11] sample!(::Mamba.SamplerVariate{Mamba.HMCTune}, ::Mamba.##298#300{Symbol}) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/hmc.jl:76
[12] (::Mamba.##297#299{Symbol,Tuple{Float64,Int64,Array{Int64,2}}})(::Mamba.Model, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/hmc.jl:61
[13] (::##15#16)(::Mamba.Model, ::Int64) at ./<missing>:0
[14] sample!(::Mamba.Model, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:99
[15] sample!(::Mamba.Model) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:94
[16] mcmc_worker!(::Array{Any,1}) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:75
[17] _collect(::Array{Array{Any,1},1}, ::Base.Generator{Array{Array{Any,1},1},Mamba.#mcmc_worker!}, ::Base.EltypeUnknown, ::Base.HasShape) at ./array.jl:454
[18] map(::Function, ::Array{Array{Any,1},1}) at ./abstractarray.jl:1865
[19] pmap2(::Function, ::Array{Array{Any,1},1}) at /Users/feynman/.julia/v0.6/Mamba/src/utils.jl:99
[20] mcmc_master!(::Mamba.Model, ::UnitRange{Int64}, ::Int64, ::Int64, ::UnitRange{Int64}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:52
[21] #mcmc#29(::Int64, ::Int64, ::Int64, ::Bool, ::Function, ::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:32
[22] mcmc(::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:22
[23] include_string(::String, ::String) at ./loading.jl:515
Hi Feynman,
Nice work tracking down the issue and creating a pull request to add an insupport
method to the Distribution package's MixtureModel type. This is the first time I have seen someone try a MixtureModel in Mamba. It's neat to see that your example works with that additional method.