【问题标题】:How to use of CDF function in Turing module of Julia?如何在 Julia 的 Turing 模块中使用 CDF 函数?
【发布时间】:2021-01-10 12:18:53
【问题描述】:

我想知道 Gamma Distribution of Awareness 的参数。 第 1 周时意识为 0.336,第 4 周时为 0.554,第 13 周时为 0.64。 数据集建在这里。数据是 Gamma dist 的 cdf。

 xs = [ 1 0.336 ; 4 0.554 ; 13 0.64 ] 

我用 Julia 编写了这个代码并使用了图灵

@model function gmodel(ds)
    m,n = size(ds)
    k ~ InverseGamma(3,2)
    a ~ InverseGamma(3,2)
    for i in 1:m
        cdf_g = cdf(Gamma(k,a),ds[i,1])
        ds[i,2] ~ Normal(cdf_g, 3)
    end
end
c = sample(gmodel(xs),NUTS(),1000) 

但是,我得到了一个错误。

MethodError: no method matching gammacdf(::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.VarInfo{NamedTuple{(:k, :a),Tuple{DynamicPPL.Metadata{Dict{DynamicPPL.VarName{:k,Tuple{}},Int64},Array{InverseGamma{Float64},1},Array{DynamicPPL.VarName{:k,Tuple{}},1},Array{Float64,1},Array{Set{DynamicPPL.Selector},1}},DynamicPPL.Metadata{Dict{DynamicPPL.VarName{:a,Tuple{}},Int64},Array{InverseGamma{Float64},1},Array{DynamicPPL.VarName{:a,Tuple{}},1},Array{Float64,1},Array{Set{DynamicPPL.Selector},1}}}},Float64},DynamicPPL.Model{var"#33#34",(:ds,),(),(),Tuple{Array{Float64,2}},Tuple{}},DynamicPPL.Sampler{NUTS{Turing.Core.ForwardDiffAD{40},(),AdvancedHMC.DiagEuclideanMetric}},DynamicPPL.DefaultContext},Float64},Float64,2}, ::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.VarInfo{NamedTuple{(:k, :a),Tuple{DynamicPPL.Metadata{Dict{DynamicPPL.VarName{:k,Tuple{}},Int64},Array{InverseGamma{Float64},1},Array{DynamicPPL.VarName{:k,Tuple{}},1},Array{Float64,1},Array{Set{DynamicPPL.Selector},1}},DynamicPPL.Metadata{Dict{DynamicPPL.VarName{:a,Tuple{}},Int64},Array{InverseGamma{Float64},1},Array{DynamicPPL.VarName{:a,Tuple{}},1},Array{Float64,1},Array{Set{DynamicPPL.Selector},1}}}},Float64},DynamicPPL.Model{var"#33#34",(:ds,),(),(),Tuple{Array{Float64,2}},Tuple{}},DynamicPPL.Sampler{NUTS{Turing.Core.ForwardDiffAD{40},(),AdvancedHMC.DiagEuclideanMetric}},DynamicPPL.DefaultContext},Float64},Float64,2}, ::Float64)
Closest candidates are:
  gammacdf(!Matched::Union{Float64, Int64}, !Matched::Union{Float64, Int64}, ::Union{Float64, Int64}) at C:\Users\kimse\.julia\packages\StatsFuns\zJ1EI\src\rmath.jl:77

如何实现和使用图灵中的CDF或PDF函数?

【问题讨论】:

    标签: julia probability-distribution automatic-differentiation


    【解决方案1】:

    这并不是真正的图灵问题——NUTS 作为 HMC 采样器,使用自动微分来获取 logpdf 的梯度。 gammacdf 来自 StatsFuns,并且未使用 ForwardDiff 注册 AD。此外,实现可能是Rmath 中的ccall

    可能的解决方案:

    • 使用其他采样器,而不是基于 AD。
    • 使用 Turing.setadbackend 尝试不同的 AD 后端。
    • 用纯 Julia 表达 gammacdf,由原始可微函数组成。
    • 添加必要的回调或前推(即,适用于前向或后向模式 AD 的渐变实现),可能使用不同的后端。

    我建议在Julia slack#autodiff 频道上提问,那里有很多非常乐于助人的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多