#julia #probability-distribution #automatic-differentiation
#джулия #распределение вероятностей #автоматическое дифференцирование
Вопрос:
Я хочу знать параметры гамма-распределения осведомленности. Осведомленность составляет 0,336 на 1 неделе, 0,554 на 4 неделе и 0,64 на 13 неделе. здесь собран набор данных. данные представляют собой cdf гамма-диапазона.
xs = [ 1 0.336 ; 4 0.554 ; 13 0.64 ]
я закодировал это в Julia и использовал Turing
@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:Userskimse.juliapackagesStatsFunszJ1EIsrcrmath.jl:77
Как реализовать и использовать функцию функций CDF или PDF в Turing?
Ответ №1:
На самом деле это не проблема Тьюринга — NUTS, как пробоотборник HMC, использует автоматическое дифференцирование для получения градиента logpdf. gammacdf
является источником StatsFuns
и не зарегистрирован для рекламы ForwardDiff
. Кроме того, реализация, вероятно ccall
Rmath
, является частью .
Возможные решения:
- Используйте другой сэмплер, не основанный на AD.
- Попробуйте другой сервер AD с.
Turing.setadbackend
- Выразить
gammacdf
в чистом виде, состоящем из примитивно дифференцируемых функций. - Добавьте необходимый откат или продвижение вперед (т.Е. Реализацию градиента, подходящую для прямого или обратного режима AD), возможно, с другим бэкэндом.
И я рекомендую спросить на #autodiff
канале о Джулии слэк, там много действительно полезных людей.