Как использовать функцию CDF в модуле Тьюринга Джулии?

#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 канале о Джулии слэк, там много действительно полезных людей.