我想实现贝叶斯学习过程,更具体地说,我想在for循环的每个times
迭代中获得一个函数,这意味着在过程结束时我希望获得一个函数。列表中包含数量为times
的函数(此数量当然作为函数参数传递)。
因此,在每一步中,我首先需要将两个函数相乘并将其规格化(表示其整数和为1),并将结果函数(后验密度)存储在列表中,该列表将用于下一个乘积迭代。
首先,我以这种方式尝试了基本函数乘法
function(data,times=1) {
func <- list()
posterior <- function(x) {1}
for(i in seq(times)) {
f0 <- function(x) {1/sqrt(2*pi*2)*exp(-0.25 * (data[i]-x)^2)}
new_f <- function(x) {f0(x) * posterior(x)}
normvalue <- integrate(new_f, lower=-10, upper=10)$value
fnorm <- function(x) {1/normvalue}
posterior <- function(x) new_f(x)*normvalue(x)
func <- c(func,list(posterior))
}
return(func)
}
这会产生地狱错误Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup:
,因此我阅读了Multiplying two functions并尝试了以下操作
function(data,times=1) {
Multiply=function(a,b){
force(a)
force(b)
function(x){a(x)*b(x)}
}
func <- list()
posterior <- function(x) {1}
for(i in seq(times)) {
f0 <- function(x) {1/sqrt(2*pi*2)*exp(-0.25 * (data[i]-x)^2)}
new_f <- Multiply(f0,posterior)
normvalue <- integrate(new_f, lower=-10, upper=10)$value
fnorm <- function(x) {1/normvalue}
posterior <- Multiply(new_f,fnorm)
func <- c(func,list(posterior))
}
return(func)
}
现在它不会产生任何错误,但是列表func
中的函数会随着变量f0
和normvalue
在下一次迭代中的更改而改变。这样,唯一正确保存的函数将是列表中的最后一个函数,多次调用此函数以获得连续的密度没有任何意义。
我如何使它工作并通过一个函数调用返回所有必需的函数?