首页 > 解决方案 > 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'yorIterativeSolvers.lmsr(X, y)但我想自己实现它。

标签: juliamathematical-optimization

解决方案


问题在于研究生的实施!和粗麻布!功能:您应该使用点分配来更改 G 和 H 矩阵的内容:

G .= -2*transpose(X) * (y - X * beta) + 2*λ*beta
H .= X'X + λ*I

如果没有点,您将替换函数参数所引用的矩阵,但传递给函数的矩阵(然后将由优化器使用)保持不变(可能是零矩阵,这就是您取回起始向量的原因)。


推荐阅读