没有得到正确的套索 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。
我是回归方面的新手,我在 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。