R语言中optimx函数未遵循约束条件的技术求助
针对变量和为100的约束优化:梯度范数方法的实践建议
看起来你选的思路很靠谱——用拉格朗日乘子法结合梯度范数优化来处理等式约束,这种方法在非参数似然最大化这类问题里确实很实用。从你给出的代码片段来看,你已经正确地把拉格朗日乘子lambda放在了变量向量的末尾,将待优化的变量p分离出来,这一步是对的。
关于你定义的grad.norm函数,我补充几个小建议:
- 记得在
h2的后续部分加上约束条件的梯度项,也就是对应变量和为100的梯度(即(sum(p) - 100)^2),这样整个目标函数才是完整的梯度平方和,能保证优化过程满足约束; - 可以在函数开头加上对
p的非负性检查(如果你的变量p有非负要求的话),避免出现除以0或者负数的情况; - 后续调用
optimx的时候,建议指定合适的优化方法(比如L-BFGS-B),同时给p设置合理的上下界,提升优化的稳定性和准确性。
你的函数框架已经很清晰了,完整的梯度范数函数大概可以写成这样的结构:
grad.norm <- function(x) { lambda <- tail(x, 1) p <- head(x, -1) # 非负性检查(可选) if(any(p <= 0)) return(Inf) # 核心梯度项 grad_terms <- ((test.betas * 81)/p + lambda)^2 # 约束条件的梯度项 constraint_term <- (sum(p) - 100)^2 h2 <- sum(grad_terms) + constraint_term return(h2) }
这样调整后,优化目标就完整对应了约束条件下的梯度零化,更容易得到符合要求的解。
内容的提问来源于stack exchange,提问作者Megan E.
相关产品推荐
相关产品推荐

