【问题标题】:Don't get the correct lasso MSE没有得到正确的套索 MSE
【发布时间】:2019-02-18 17:34:09
【问题描述】:

我是回归新手,我在 matlab 中编写了一个非常简单的代码,它使用 lasso 函数只是为了看看我是否了解 lasso 的 MSE 是如何计算的。但我得到的 mse 与套索的输出不同。我可能遗漏了一些东西,如果有人能告诉我哪里错了,我将不胜感激。为了计算 MSE,我使用了此链接中的以下公式: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 错误。 谁能告诉我的代码有什么问题?

谢谢

【问题讨论】:

  • 我建议您首先整理代码并删除您所做的一堆不必要的冗长操作。例如。 Beta_0不需要repmat'ed,或者你不需要temp,你可以直接在同一行计算平方根。你的 for 循环不应该超过 5 或 6 行,现在它只会让它更难理解。
  • 我更新了代码并缩短了它。循环现在只有几行(大部分是 fprintf 行)。
  • 您确定您对x^{T}*beta 的实现是正确的吗?我对 Lasso 没有经验,但我觉得那部分不太对(你似乎没有转置 X)
  • 我什么都不确定。这就是我在这里发帖的原因。如果我转置 X,那么我将无法将它与 beta 相乘。我不知道为什么公式中的转置符号,但我需要忽略它,否则我将无法进行计算。
  • @David 正如我在回答中提到的那样:您的代码很好,您只是使用了错误的方程式!

标签: regression matlab lasso-regression


【解决方案1】:

你只是使用了错误的公式

当您想提出一个最小化问题时,您可以将正则化和其他项添加到函数中以最小化,在您的情况下,这就是您共享的方程。

但是,当您想要验证结果时,您只需要了解应用于模型的解决方案与实际数据相比有何不同。这意味着当您计算误差(本例中为 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) 的 beta。在您的情况下是相同的,因为您使用的是一组不同的 lambda。您可以在解决方案中看到您的大 lambdas 也解决了方程,但解决方案更适合真实数据。你这样做是为了选择最好的 lambda。

【讨论】:

  • 谢谢!这是有道理的,因为目标最终是尽可能接近 y_i 个样本。事实上,我使用了错误的方程式。谢谢你的解释!
  • 您能解释一下为什么在 Lasso 中我希望尽可能多的 beta 值为零吗?
  • @David 你用这个方程最小化了两件事:a)2范数(方程的左边部分)使你的模型尽可能接近y和b)1范数beta,即您希望 beta 具有尽可能小的值。最小值为零(因为您正在做abs())。它就是套索的作用,它是专门为此设计的。它在很多应用中都非常有用
  • 知道了。谢谢!
  • ridge 是否也在做同样的事情(试图让尽可能多的 beta 值为零)?它试图最小化 2 个 beta 范数而不是 1 个 beta 范数(正方形而不是 abs)。还是有不同的目标? (我无法弄清楚它们之间的目标差异)。
猜你喜欢
  • 2023-03-16
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2019-07-20
  • 2020-02-04
相关资源
最近更新 更多