我需要根据一个函数之前的定义来覆盖它,这导致了一个堆栈溢出错误.我已经尝试过用deepcopy(f),但它只是返回一个对f的引用,所以这不起作用.我需要能够反复做的是。
Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
Old(x) = deepcopy(New(x))
New(x) = updating_function(Old, Y2)
[...]
EDIT:我的总体目标是有一个函数,接受一个先验分布,然后吐出一个后验,由于我的应用,有一个不寻常的信号结构,一个简单的运行的例子是:
Old_pdf(x)= pdf(Uniform(),x)
Old_mean=0.5
function BU(d,low)
value, tol = quadgk(Old_pdf, Old_λ, 1)
truncated(λ)=d(λ)/value
end
Newpdf=BU(Old_pdf,Old_mean)
Old_mean, tol= quadgk(x -> Newpdf(x)*x, Old_mean, 1)
Old_pdf=BU(Old_pdf,Old_mean)
我知道这个例子可以用Distributions包中的函数来解决。但在我的应用中却不是这样。
我发现 这个问题 并阅读了IRTools包的文档,但我无法使其工作。特别是当我尝试
Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
const Old_ir= IRTools.Inner.code_ir(New, Tuple{Int})
Old(x) = IRTools.func(Old_ir)
我得到了一个不像函数的对象,因此在代码的其余部分产生了方法错误。我做了几次尝试,完全有可能是我遗漏了一些琐碎的东西。
Y1 = 5.0
Y2 = 7.0
updating_function(f1,c) = x -> 2.0 * f1(x) + c
Old = x->sqrt(x)
New = updating_function(Old, Y1)
Old = New
New = updating_function(Old, Y2)
我想你只是需要匿名函数。
function BU(f, λ, y)
# I guess here you would use the observations `y` in some way?
z, _ = quadgk(f, λ, 1)
return λ -> f(λ) / z
end
mean(f, λ) = quadgk(x -> f(x) * x, λ, 1)[1]
original_pdf(x) = pdf(Uniform(), x)
f = original_pdf
λ = 0.5
for y in Y
f = BU(f, λ, y)
λ = mean(f, λ)
end
我已经很努力了,我想我明白你在做什么 但你举的例子不是很清楚。 考虑一下这个概念。
这种东西很好 褶皱顺便说一下