我有下一个问题:
考虑一组方程y=ax+b
,其中我知道y和x,并希望使用最小二乘法估计a
和b
。
我们假设有Y=[y1 ; y2]
和
A=[x1 1; x2 1]
以Y=A*[a;b]
根据最小二乘法:
B=[a;b]=( transpose(A)*A )^-1*transpose(A)*Y
(A'*A) \ A'*Y
和A\Y
是一样的吗?
这是计算B的最佳方法:
inv( transpose(A)*A ) *transpose(A)*Y
(transpose(A)*A) \ transpose(A)*Y
(A'*A) \ A'*Y
pinv(A)*Y
(计算伪逆矩阵)
以上所有结果略有不同
答案 0 :(得分:2)
在解决您的疑虑之前,必须发表评论。如果要使用速记运算符转置矩阵,则不应使用'
,而应使用.'
。第一个是conjugate transpose的速记运算符,而第二个是用于transpose的正确速记运算符。虽然它们通常产生相同的结果,但使用包含复数的矩阵的前者可能会使计算混乱。
由于您未提供数据样本,因此以下是我为测试部署的设置:
Y = [2; 4];
A = [3 1; 7 1];
现在,让我们一步一步走。对于你的第一个答案,是的,这两个操作在数学观点上是等价的,并产生基本相同的结果:
>> B = A \ Y
B =
0.5
0.5
-----------------------------
>> B = inv(A.' * A) * A.' * Y
B =
0.500000000000001
0.5
您看到的细微差别是因为INV(A) * b
不如A \ b
准确,如果您将呼叫暂停到{{1},即使是Matlab代码解释器也明确说明了这一点。函数后跟乘法(应该用橙色警告突出显示):
这也部分回答了你的第二个问题,但让我们做一个详尽的基准测试。我放弃了使用inv
执行的计算,因为建议避免使用它。我们走了:
inv(A.' * A) * A.' * Y
这是基准测试的结果:
tic();
for i = 1:100000
B = A \ Y;
end
toc();
tic();
for i = 1:100000
B = pinv(A) * Y;
end
toc();
tic();
for i = 1:100000
B = (A.' * A) \ A.' * Y;
end
toc();
鉴于这三种方法具有相同的准确性......第一种方法是迄今为止,显然是最快的方法。