julia - 如何在 Julia 的 Turing 模块中使用 CDF 函数?
问题描述
我想知道 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函数?
解决方案
这并不是真正的图灵问题——NUTS 作为 HMC 采样器,使用自动微分来获得 logpdf 的梯度。 gammacdf
来自StatsFuns
,并且没有注册 AD ForwardDiff
。此外,实现可能是ccall
in Rmath
。
可能的解决方案:
- 使用另一个采样器,而不是基于 AD。
- 尝试使用
Turing.setadbackend
. - 用纯 Julia表达
gammacdf
,由原始可微函数组成。 - 添加必要的回调或前推(即,适用于前向或后向模式 AD 的梯度实现),可能使用不同的后端。
我建议在Julia slack#autodiff
的频道上提问,那里有很多非常乐于助人的人。
推荐阅读
- rest - Goroutine 已经从请求开始在 Go Web 服务器中但客户端断开连接,Web 服务器是否可以关闭该特定的 Goroutine?
- sql-server - 授予对表的权限,作为主体重要吗?
- c++ - 为什么我的函数最后返回 0 或 1?
- javascript - couchbase 按部分键查看查询组
- powershell - 带有 Get-Mailbox 和 Get-MailboxStatistics 的 Powershell 脚本缺少输出
- excel - 输入日期后,宏将运行
- java - Apache Timer 运行两次
- android - ScrollView 内的 ConstraintLayout
- python - Python / Pandas / Pulp 优化重复
- django - 显示通过管理员上传的图像