Julia中Optim.jl含常量参数的带梯度代价函数优化问询
解决Optim.jl带常量参数的带梯度代价函数优化问题
要处理带常量参数C的代价函数,核心是通过**闭包(匿名函数)**将常量参数绑定到目标函数中,使其符合Optim.jl要求的参数签名(仅接受F、G、x三个参数)。具体实现步骤如下:
正确代码示例
using LinearAlgebra using Optim # 带常量参数C的代价函数(含梯度) function cost!(F, G, x, C) if G !== nothing G .= C * x end if F !== nothing return C * dot(x, x) / 2 end end # 定义你的常量参数C C = 2.0 # 用闭包包装,将C绑定到新函数中,使其参数签名符合要求 cost_with_C!(F, G, x) = cost!(F, G, x, C) # 执行优化 sol = optimize(Optim.only_fg!(cost_with_C!), randn(5), LBFGS())
关键说明
- 闭包的作用:通过
cost_with_C!这个闭包,我们把常量C捕获为内部变量,让新函数只需要接收F(代价输出)、G(梯度输出)、x(优化变量)三个参数,完全匹配Optim.only_fg!的要求。 - 匿名函数简化写法:你也可以直接用匿名函数缩短代码,效果完全一致:
cost_with_C! = (F, G, x) -> cost!(F, G, x, C) - 常量参数稳定性:闭包会捕获定义时
C的当前值,后续修改C不会影响已经定义的闭包,保证优化过程中参数的稳定性。
内容的提问来源于stack exchange,提问作者Sakurai.JJ
相关产品推荐
相关产品推荐

