无法让 Julia Flux 用于简单的线性回归测试
Can't get Julia Flux to work for simple linear regression test
我是 Julia 用户,刚接触 Flux 和机器学习。作为第一个测试并了解 Flux 的工作原理,我尝试使用 Flux 来估计一个简单的线性回归模型。但显然我做错了什么,因为使用火车训练模型!没有给我预期的 OLS 系数。这让我很吃惊;由于线性回归是一个简单的凸优化问题,我希望梯度下降能够快速收敛到最优值。所以我想我对如何训练有误解!有效。
这是我的代码:
using Flux
using Flux: @epochs
using GLM
# Load data: The features of the Iris data set
features = Flux.Data.Iris.features();
x = features[1:3,:];
y = features[4,:];
J, N = size(x); # number of explanatory variables, number of observations
model = Chain(Dense(J,1)); # define the model
loss(x,y) = Flux.Losses.mse(model(x),y); # define the loss function
function loss_all(X,y) # and define a full-sample loss function
l = 0;
for i in 1:length(y)
l += loss(X[:,i],y[i]);
end
return l
end
loss_all(x,y)
@epochs 10000 Flux.train!(loss, params(model), [(x,y)], Descent(0.01)); # train the model
loss_all(x,y)
# How does the result compare to OLS (should be exactly the same)?
x_augmented = vcat(ones(1,N),x);
ols = inv(x_augmented*transpose(x_augmented))*x_augmented*y
y_hat = transpose(x_augmented)*ols;
sse = sum((y_hat - y).^2)
我想我犯了一个愚蠢的错误,但如果有人能帮助我找出问题,我将不胜感激。
修复它的最简单方法是确保 y
的形状匹配 model(x)
:
y = features[4:4,:];
注意:
Flux.Losses.mse(model(x),y)
扩展为:
mean((model(x) .- y).^2)
所以 model(x)
和 y
应该具有相同的形状(在我修复后它们是 (1,150)
)。在您的原始代码中,它是 (1,150)
vs (150,)
,这意味着尺寸在 (model(x) .- y).^2
.
之后广播到 (150,150)
我是 Julia 用户,刚接触 Flux 和机器学习。作为第一个测试并了解 Flux 的工作原理,我尝试使用 Flux 来估计一个简单的线性回归模型。但显然我做错了什么,因为使用火车训练模型!没有给我预期的 OLS 系数。这让我很吃惊;由于线性回归是一个简单的凸优化问题,我希望梯度下降能够快速收敛到最优值。所以我想我对如何训练有误解!有效。
这是我的代码:
using Flux
using Flux: @epochs
using GLM
# Load data: The features of the Iris data set
features = Flux.Data.Iris.features();
x = features[1:3,:];
y = features[4,:];
J, N = size(x); # number of explanatory variables, number of observations
model = Chain(Dense(J,1)); # define the model
loss(x,y) = Flux.Losses.mse(model(x),y); # define the loss function
function loss_all(X,y) # and define a full-sample loss function
l = 0;
for i in 1:length(y)
l += loss(X[:,i],y[i]);
end
return l
end
loss_all(x,y)
@epochs 10000 Flux.train!(loss, params(model), [(x,y)], Descent(0.01)); # train the model
loss_all(x,y)
# How does the result compare to OLS (should be exactly the same)?
x_augmented = vcat(ones(1,N),x);
ols = inv(x_augmented*transpose(x_augmented))*x_augmented*y
y_hat = transpose(x_augmented)*ols;
sse = sum((y_hat - y).^2)
我想我犯了一个愚蠢的错误,但如果有人能帮助我找出问题,我将不胜感激。
修复它的最简单方法是确保 y
的形状匹配 model(x)
:
y = features[4:4,:];
注意:
Flux.Losses.mse(model(x),y)
扩展为:
mean((model(x) .- y).^2)
所以 model(x)
和 y
应该具有相同的形状(在我修复后它们是 (1,150)
)。在您的原始代码中,它是 (1,150)
vs (150,)
,这意味着尺寸在 (model(x) .- y).^2
.
(150,150)