Optim.jl中含额外参数的解析梯度!函数适配MLE优化问题
问题解决:Optim.jl解析梯度函数的MethodError修复
错误原因
你遇到的MethodError核心原因是Optim.jl要求梯度函数的签名必须为g!(G, x),其中x是完整的优化参数向量(比如你场景中的[ω, λ])。但你定义的g_RPM_Data!将参数拆成了两个独立的Real类型,和Optim调用时传入的向量类型不匹配,导致方法无法匹配。
修复方案(保留内存优化)
直接调整g_RPM_Data!的函数签名,让它接收向量形式的优化参数,解构出ω和λ后再调用原梯度函数,同时保留原地修改G的内存优化特性:
function g_RPM_Data!(G, x::Vector) ω, λ = x # 从优化参数向量中解构出ω和λ g_RPM!(G, ω, λ, Data, ω⃰) # 调用原梯度函数,原地修改G end
验证优化代码
修改后,你的优化代码可以正常执行,因为g_RPM_Data!完全符合Optim要求的梯度函数签名:
opt_RPM_LBFGS_analytical = optimize( x->-loglikelihood_RPM_Gumbel(x[1], x[2], Data, ω⃰), g_RPM_Data!, ones(2), LBFGS() )
可选简化方案(匿名函数)
如果不想单独定义g_RPM_Data!,也可以直接用匿名函数适配签名(性能损失可忽略,适合快速调试):
opt_RPM_LBFGS_analytical = optimize( x->-loglikelihood_RPM_Gumbel(x[1], x[2], Data, ω⃰), (G, x) -> g_RPM!(G, x[1], x[2], Data, ω⃰), ones(2), LBFGS() )
内容的提问来源于stack exchange,提问作者user23329063
相关产品推荐
相关产品推荐

