R语言使用nlminb优化时目标函数返回-Inf问题咨询
解决方案
限制参数搜索范围(优先推荐)
你可以直接在nlminb调用时传入lower和upper参数,限定所有参数的搜索区间,从根源上避免参数进入会产生-Inf的非法取值区间(比如对数函数的入参不能小于等于0、比例类参数不能为负等),参考写法:
# 以下参数上下界需根据你的实际业务含义调整,示例为4个参数的取值限制 optimize = nlminb(init, my_function, additional_values1 = matrix1, additional_values2 = matrix2, data = my_data, hessian = T, lower = c(-10, 0, -5, 0), upper = c(10, 10, 5, 15))
为目标函数添加非法值惩罚
如果无法明确参数的合理范围,可以修改自定义目标函数,对非有限值(-Inf/Inf/NA)返回惩罚值,引导优化器避开非法参数区间,参考修改:
my_function = function(params, additional_values1, additional_values2, data){ # 原有计算逻辑保持不变 value <- 原有计算代码 # 新增非法值校验逻辑 if(!is.finite(value)){ # nlminb默认执行最小化,此处返回足够大的正数作为惩罚;若你是将最大化问题转为最小化,需对应调整惩罚方向 return(1e10) } return(value) }
记录迭代过程中的合法结果
如果需要保留最后一次合法的参数与目标函数值,可以通过环境变量记录每一步的有效调用结果:
# 初始化存储环境,用于记录合法结果 trace_env <- new.env() trace_env$last_valid_par <- init trace_env$last_valid_obj <- 1e10 # 初始值根据优化方向调整 my_function = function(params, additional_values1, additional_values2, data){ # 原有计算逻辑保持不变 value <- 原有计算代码 # 新增记录逻辑 if(is.finite(value)){ trace_env$last_valid_par <- params trace_env$last_valid_obj <- value } return(value) }
nlminb运行结束后,直接从trace_env中即可读取最后一次的合法参数与目标值。
内容的提问来源于stack exchange,提问作者NM_
相关产品推荐
相关产品推荐

