天天看点

matlab测试岭回归(正则化回归)

矩阵A的条件数等于A的范数与A的逆的范数的乘积,即cond(A)=‖A‖·‖A^(-1)‖,是判断矩阵病态与否的一种度量,条件数越大矩阵越病态。对应矩阵的3种范数,相应地可以定义3种条件数: 函数 cond(A)1、cond(A)2以及cond(A)∞。当A奇异时,条件数为无穷。

在matlab中,由于舍入误差,奇异矩阵经常又能算出一个不为0的结果。

>> cond([1 2; 2 4])

ans =

   2.5176e+16


>> cond([1 2; 1 2])

ans =

   Inf

           

在回归的时候一不小心就会碰到设计阵不满秩的情况,在不同的机器上算出来的结果可能差异很大,这时候可以用岭回归或者lasso的方法,下面是一个简单的例子

beta = [1 2]';
x = [0.7; 0.9];

X1 = [ones(length(x), 1), x];
% y = X1*beta + 0.01*randn(length(x), 1);
y = X1*beta;

X2 = [ones(length(x), 1), x, x.^2];
% y2 = X2*[beta; 0] + 0.01*randn(length(x), 1);

cond(X1'*X1)
cond(X2'*X2)
cond(X2'*X2 + 1e-8*eye(3))

bh1 = (X1'*X1) \ (X1' * y)
yh1 = X1 * bh1

bh2 = (X2'*X2) \ (X2'* y)
yh2 = X2 * bh2  % yh2 很接近y,但是bh2与beta差异很大

bh3 = regress(y, X2)
yh3 = X2 * bh3

% 岭回归,正则化
lambda = 1e-8;  % lambda 要比较小
bh4 = (X2'*X2 + lambda*eye(3)) \ (X2'* y)
yh4 = X2 * bh4


lambda = 0.1;
bh5 = (X2'*X2 + lambda*eye(3)) \ (X2'* y)
yh5 = X2 * bh5

% lasso, 结果都不太好,只有第二项不为0
bh6 = lasso(X2, y);
yh6 = X2 * bh6;

%%
xx = linspace(0.5, 1, 101)';
XX = [ones(length(xx), 1), xx, xx.^2];

plot(xx, XX*[bh1; 0]); hold on
plot(xx, XX*bh2);
plot(xx, XX*bh3); % 都过那两个点,但是差异很大
plot(xx, XX*bh4);
plot(xx, XX*bh5);
% plot(xx, XX*bh6);  % 多条线
hold off
legend('linear', 'quadratic', 'regression', 'lambda=1e-6', 'lambda=0.1')

           

参考

搜狗百科--矩阵条件数

https://baike.sogou.com/v59977160.htm?fromTitle=%E7%9F%A9%E9%98%B5%E6%9D%A1%E4%BB%B6%E6%95%B0

为什么算出的结果不一样

https://www.mathworks.com/matlabcentral/answers/130493-how-come-i-get-different-output-answers-with-the-same-matlab-version-the-same-code-installed-on-two

【机器学习】正则化的线性回归 —— 岭回归与Lasso回归

https://www.cnblogs.com/Belter/p/8536939.html

解读正则化 LASSO回归 岭回归

继续阅读