矩阵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
为什么算出的结果不一样
【机器学习】正则化的线性回归 —— 岭回归与Lasso回归
https://www.cnblogs.com/Belter/p/8536939.html