You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 21:54:04