运行5年前Julia线性回归代码时norm函数栈溢出错误的解决问询
解决JuMP中范数约束栈溢出的问题
问题原因
旧版本JuMP对Base库的norm函数有重载,能自动将范数约束转换为合适的优化约束,但新版本中,norm函数与JuMP的VariableRef/AffExpr类型交互时,触发了函数递归调用(如norm与norm2循环调用),导致StackOverflowError。
替代实现方案
方案一:展开2范数平方约束
原约束norm(y - X*beta) <= t等价于残差向量的平方和小于等于t的平方(需保证t >= 0,因为范数非负),代码实现如下:
# 定义残差向量 residual = y - X * beta # 约束t非负 @constraint(m, t >= 0) # 平方形式的范数约束 @constraint(m, sum(residual[i]^2 for i in eachindex(residual)) <= t^2)
这种方式无需依赖二阶锥求解器,适合基础求解器场景。
方案二:使用二阶锥约束(推荐)
范数约束属于二阶锥优化(SOCP)的标准形式,现代JuMP支持直接通过二阶锥类型定义约束,效率更高,代码如下:
# 定义残差向量 residual = y - X * beta # 二阶锥约束:[t; 残差向量] 属于二阶锥 @constraint(m, [t; residual] in SecondOrderCone())
该方式需要使用支持二阶锥的求解器(如Gurobi、CPLEX、Mosek等),求解大维度问题时性能更优。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

