如何将网格搜索与ode模型关联以寻找aux参数的最优组合?
如何将网格搜索与ode模型关联以寻找aux参数的最优组合?
看起来你已经搭好了ODE模型和参数网格,接下来要做的就是把这两者串联起来,计算每个参数组合对应的模型输出,再根据你定义的「最优」标准挑出最好的那组参数。我一步步给你说怎么做:
第一步:明确你的「最优」标准
首先得先定义清楚什么是你要的「最优」——是让最终时刻(t=30)的sK值最大?还是让net_f的累积值最小?这里我先假设你的目标是最大化t=30时的sK值,你可以根据自己的需求随时调整目标指标。
第二步:封装模型计算函数
写一个小函数,输入一组aux参数,运行你的ODE模型,然后返回你关心的目标值:
# 定义计算目标值的函数 compute_target <- function(params) { # 将输入的参数转换为aux的格式 aux <- c(aH = params[["aH"]], aRel = params[["aRel"]], aRes = params[["aRes"]], aS = params[["aS"]]) # 运行ODE模型 out <- data.frame(ode(times = time, y = stock, parms = aux, func = model, method = 'euler')) # 返回t=30时的sK值(这里是我们的优化目标,可替换) return(out$sK[out$time == 30]) }
第三步:遍历参数网格计算目标值
接下来我们要遍历你用crossing生成的参数网格d,给每一行参数计算对应的目标值。这里有两种常用方法:
方法1:Base R的apply函数
# 给参数网格添加target列,存储每个组合的目标值 d$target <- apply(d, 1, compute_target)
方法2:Tidyverse的purrr包(更直观)
如果你习惯用tidyverse风格的代码,可以用pmap_dbl来遍历每一行参数:
library(tidyverse) d <- d %>% mutate(target = pmap_dbl(., compute_target))
第四步:筛选最优参数组合
现在参数网格里已经有了每个组合的目标值,直接找到目标值最优的那一行即可:
# 最大化目标值用which.max,最小化用which.min best_params <- d[which.max(d$target), ] print(best_params)
一些补充说明
- 调整优化目标:如果你的目标不是最终时刻的
sK,只需要修改compute_target里的返回值就行,比如:# 例子1:返回整个时间序列中sK的平均值 return(mean(out$sK)) # 例子2:返回net_f的累积总和 return(sum(out$net_f)) - 优化计算速度:你的参数网格有10×10×10×10=10000个组合,计算可能需要一点时间。如果想提速,可以:
- 先缩小参数范围(比如从0.2到0.8,步长0.1)减少组合数
- 用并行计算,比如用
parallel包的mclapply代替apply,或者furrr包实现并行遍历
备注:内容来源于stack exchange,提问作者user11806155
相关产品推荐
相关产品推荐

