【发布时间】:2013-05-25 18:30:44
【问题描述】:
我找不到任何关于如何在 R 中处理无限递归的建议。我想以最一般的方式说明我的问题,以便其他人可以从中受益。随意编辑它。
我曾经运行过一个双循环
for (k in 1:n){ for (i in 1:m){
f[i,,k] <- an expression that depends on g[i-1,,k]
g[i,,k] <- a mixture of g[i-1,,k] and f[i,,k]}}
这运行良好,但现在我希望找到最符合我标准的 k。所以我决定把它变成一个函数,以便我以后可以优化或 uniroot 它。我写了类似的东西:
f <- function(i,k){an expression that depends on g(i-1,k)}
g <- function(i,k){an expression that depends on g(i-1,k) and f(i,k)}
我认为这两个问题很相似,但令我惊讶的是,我得到了无限递归错误。
我阅读了有关最大内存的信息,但我确信有一种更美观的方式来做到这一点。
我的可重现示例:
library(memoise)
gradient <- function(x,y,tau){if (x-y > 0) {- tau} else {(1-tau)}}
aj <- c(-3,-4,-2,-3,-5,-6,-4,-5,-1,rep(-1,15))
f <- function(x,vec){sum(x^vec)-1}
root <- uniroot(f, interval=c(0,200), vec=aj)$root
memloss<-function(i,k){if (i==1) {c(rep(0,24))} else if (i <= 0 | k < -5) {0} else {gradient(dailyreturn[i-1],weight(i-1,k)%*%A[i-1,],0.0025)*A[i-1,]}}
memweight <- function(i,k){if (i==1) {c(rep(root,24)^aj)} else if (i <= 0 | k < -5) {0} else {(exp(- (2^(k)/(sqrt(1415))) * loss(i,k))) / (weight(i-1,k) %*% exp(- 2^(k)/(sqrt(1415)) * loss(i,k)) ) * weight(i-1,k)}}
loss <- memoize(memloss)
weight <- memoize(memweight)
dailyreturn 是一个向量(长度为 2080)
A 是一个 1414 x 24 矩阵
希望对你有帮助。
【问题讨论】: