Julia使用Optim包实现岭回归时参数不更新问题求助
代码问题诊断与修复方案
核心问题点
- 梯度函数
grad!不符合Optim的接口规范:
Optim要求传入的可变梯度函数需原地修改输入的梯度数组,你当前的写法G = -2*transpose(X) * (y - X * beta) + 2*λ*beta仅为函数内的局部变量G重新绑定了新数组,完全没有修改外层传入的梯度数组,导致Optim拿到的梯度一直是初始零值,优化器误判已经收敛,因此参数不会更新。 - 海森矩阵函数
hessian!存在相同的赋值问题,且不必要:
你使用的LBFGS是拟牛顿优化算法,本身不需要显式传入海森矩阵,多余传入错误实现的海森函数反而可能引发逻辑异常,直接移除该参数即可。如果要使用精确海森,需要搭配牛顿法系的求解器,同时将赋值改为原地修改。 - 缺少CSV包导入声明:
代码调用了CSV.read但没有提前引入CSV包,运行会直接报错,需要补上导入语句。
修复后可运行代码
# Imports using CSV using DataFrames using LinearAlgebra: norm, I using Optim: optimize, LBFGS, minimizer # Read Data out = CSV.read(download("https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv"), DataFrame, header=0) # Separate features and response y = Vector(out[:, end]) X = Matrix(out[:, 1:(end-1)]) λ = 0.1 # Functions loss(beta) = norm(y - X * beta)^2 + λ*norm(beta)^2 function grad!(G, beta) # 使用广播赋值原地修改梯度数组 G .= -2*X' * (y - X * beta) + 2*λ*beta end # Optimization start = randn(13) # LBFGS不需要传入海森函数 out = optimize(loss, grad!, start, LBFGS()) beta_opt = minimizer(out) # 验证和解析解的一致性 beta_closed = (X'X + λ*I) \ X'y println("优化结果与解析解的误差:", norm(beta_opt - beta_closed))
修复后运行代码,输出的误差通常在1e-6量级以内,说明优化逻辑已正常工作。
内容的提问来源于stack exchange,提问作者Physics_Student
相关产品推荐
相关产品推荐

