julia - Julia:为什么岭回归不起作用(优化)
问题描述
我正在尝试在 Julia 中从头开始实现岭回归,但出现了问题。
# Imports
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*transpose(X) * (y - X * beta) + 2*λ*beta
end
function hessian!(H, beta)
H = X'X + λ*I
end
# Optimization
start = randn(13)
out = optimize(loss, grad!, hessian!, start, LBFGS())
但是,这样做的结果很糟糕,我们基本上会回来start
,因为它没有移动。当然,我知道我可以简单地使用(X'X + λ*I) \ X'y
orIterativeSolvers.lmsr(X, y)
但我想自己实现它。
解决方案
问题在于研究生的实施!和粗麻布!功能:您应该使用点分配来更改 G 和 H 矩阵的内容:
G .= -2*transpose(X) * (y - X * beta) + 2*λ*beta
H .= X'X + λ*I
如果没有点,您将替换函数参数所引用的矩阵,但传递给函数的矩阵(然后将由优化器使用)保持不变(可能是零矩阵,这就是您取回起始向量的原因)。
推荐阅读
- javascript - onsubmit 表单验证。即使有错误也提交表单
- sql - 从 JSON“对象”中提取 SQL
- python - 使用字典进行字符串压缩
- c# - 如何处理实体框架中存储过程的动态结果?
- javascript - 订阅服务作为 *ngFor 数组的长度
- javascript - 将 excel 文件转换为 Google 电子表格并自动替换现有的电子表格文件
- python - 学校项目的网络抓取
- rest - 在 java 中读取 POST 请求正文的内容(使用 REST)
- json - 如何通过 elasticsearch 将对象转换为 Json 查询
- django - 当我们手动更改表时无法获取模型的所有字段