没有得到正确的套索 MSE

Don't get the correct lasso MSE

我是回归方面的新手,我在 matlab 中编写了一个非常简单的代码,它使用套索函数只是为了看看我是否理解套索的 MSE 是如何计算的。但我得到的 mse 与套索的输出不同。我可能遗漏了一些东西,如果这里有人能告诉我哪里错了,我将不胜感激。为了计算 MSE,我使用了这个 link 中的以下公式:https://www.mathworks.com/help/stats/lasso.html

这是我编写的 matlab 代码:

clear;
close all;
clc;

% Checking lasso MSE from this link:
% https://www.mathworks.com/help/stats/lasso.html

n = 10;
p = 3;
X = 20*rand(n,p);
min_val = -20;
max_val = 20;  
y = min_val + (max_val - min_val)*rand(n,1);

lambda_vals = [0.2, 0.8, 1, 1.5];
[beta_vectors , FitInfo] = lasso(X, y, 'Lambda', lambda_vals);

eps = 10^-10;
num_of_lambda_vals = length(lambda_vals);
for i=1:num_of_lambda_vals 
    current_calculated_mse = sum((y - FitInfo.Intercept(i) - X*beta_vectors(:,i)).^2)/(2*n) +...
        lambda_vals(i)*sum(abs(beta_vectors(:,i)));    
    current_mse = FitInfo.MSE(i);

    fprintf('current_calculated_mse = %f\n',current_calculated_mse);
    fprintf('current_mse = %f\n',current_mse);
    sqr_diff_mses = (current_calculated_mse-current_mse)^2;
    if (sqr_diff_mses > eps)
        fprintf('The calculated MSE is wrong!\n');
    end
    fprintf('\n');
end

如果您 运行 代码,它将打印出计算 MSE 错误。 谁能告诉我我的代码有什么问题?

谢谢

你只是用错了方程

当你想提出一个最小化问题时,你会在一个函数中添加正则化和其他项来最小化,在你的例子中,这是你共享的方程。

但是,当您想要验证您的结果时,您只想知道您的解决方案与实际数据相比有何不同应用于模型。这意味着当您计算误差(在本例中为 MSE)时,您只需要:

您的解决方案应用于模型的位置

简而言之:将current_calculated_mse更改为

current_calculated_mse = sum((y - FitInfo.Intercept(i) - X*beta_vectors(:,i)).^2)/(n);    

输出:

current_calculated_mse = 116.748997
current_mse = 116.748997

current_calculated_mse = 122.421290
current_mse = 122.421290

current_calculated_mse = 125.824726
current_mse = 125.824726

current_calculated_mse = 137.641287
current_mse = 137.641287

为什么不使用误差最小化方程?如果我们最小化它是有道理的!

是的!和不。您提出了一个最小化方程来引导具有某些所需属性的解决方案,在 Lasso 的情况下,您希望尽可能多的 beta 值为零。但这并不意味着您的解决方案有任何好处。

您也可以最小化表示 argmin ( beta*x-y )*0+(1-beta) 的等式。已求解的方程式将 beta=1 作为完美的极小值,但这是否意味着您的解决方案是完美的?一点都不!您刚刚选择了一个错误的函数来最小化。您希望测试版更适合真实数据 (y)。在您的情况下是相同的,因为您使用的是一组不同的 lambda。您可以在解决方案中看到您的大 lambda 表达式也解决了方程式,但这些解决方案更适合真实数据。您这样做是为了选择最佳的 lambda。