Can';t让Julia Flux用于简单线性回归测试

Can';t让Julia Flux用于简单线性回归测试,julia,julia-flux,Julia,Julia Flux,我是Flux和机器学习的新手。作为第一个测试,为了理解通量是如何工作的,我尝试使用通量来估计一个简单的线性回归模型。但很明显,我做错了什么,因为我用train训练模型!没有给我预期的OLS系数。这让我很惊讶;由于线性回归是一个简单的凸优化问题,我希望梯度下降能迅速收敛到最优值。所以我想我误解了一些关于如何训练的事情!工作 这是我的密码: using Flux using Flux: @epochs using GLM # Load data: The features of the Iris

我是Flux和机器学习的新手。作为第一个测试,为了理解通量是如何工作的,我尝试使用通量来估计一个简单的线性回归模型。但很明显,我做错了什么,因为我用train训练模型!没有给我预期的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
的形状与
模型(x)
匹配:

请注意:

Flux.Losses.mse(model(x),y)
扩展到:

mean((model(x) .- y).^2)

因此
model(x)
y
应该具有相同的形状(在我修复后,它们是
(1150)
)。在您的原始代码中,它是
(1150)
vs
(150,)
,这意味着尺寸在
(型号(x)。-y)之后被广播到
(150150)
。^2

非常感谢,Bogumil!我想你指的是y=特征[[4],:];但这解决了问题。非常感谢!
mean((model(x) .- y).^2)