我正在阅读https://github.com/probcomp/gen-quickstart上的“Gen 建模简介”笔记本
第 5 节(调用其他生成函数)要求“构建一个数据集,其中线或正弦波模型是最好的是模棱两可的”
我很难理解如何使用组件函数的跟踪(和返回)来创建我可以使用的有意义的高阶跟踪。
对我来说,最直接的“模棱两可”模型是line(xs).+sine(xs)
. 所以我Gen.simulate
编辑line
并sine
获取痕迹并将它们添加在一起,如下所示:
@gen function combo(xs::Vector{Float64})
my_sin = simulate(sine_model_2,(xs,))
my_lin = simulate(line_model_2,(xs,))
if @trace(bernoulli(0.5), :is_line)
@trace(normal(get_choices(my_lin)[:slope], 0.01), :slope)
@trace(normal(get_choices(my_lin)[:intercept], 0.01), :intercept)
@trace(normal(get_choices(my_lin)[:noise], 0.01), :noise)
else
@trace(normal(get_choices(my_sin)[:phase], 0.01), :phase)
@trace(normal(get_choices(my_sin)[:period], 0.01), :period)
@trace(normal(get_choices(my_sin)[:amplitude], 0.01), :amplitude)
@trace(normal(get_choices(my_sin)[:noise], 0.01), :noise)
end
combo = [get_choices(my_sin)[(:y, i)] + get_choices(my_lin)[(:y, i)] for i=1:length(xs)]
for (i, c) in enumerate(combo)
@trace(normal(c, 0.1), (:y, i))
end
end;
这显然是错误的,我知道我在 Gen.
我希望能够从组合中内省 sine/line_model 的迹线,并对迹线进行元素添加以获得新的迹线。并且不必随机选择接近:intercept、:phase 等的数字,因此我可以稍后将其包含在我的跟踪中。
顺便说一句,当我这样做时:
traces = [Gen.simulate(combo,(xs,)) for _=1:12];
grid(render_combined, traces)
请帮忙谢谢!