Я хочу реализовать байесовскую процедуру обучения, а более конкретно, я хочу получить одну функцию на каждой из times
итераций цикла for, что означает, что в конце процедуры я хочу получить список с число 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:
, поэтому я прочитал Умножая две функции и попробовал следующее
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
в следующих итерациях. Таким образом, единственно правильно сохраненная функция будет последней в списке, и нет смысла вызывать эту функцию несколько раз для получения последовательных значений плотности.
Как мне заставить это работать и вернуть все необходимые функции всего за один вызов функции?