Matlab中最小二乘法的参数估计

时间:2018-02-25 01:38:30

标签: matlab least-squares

我有下一个问题: 考虑一组方程y=ax+b,其中我知道y和x,并希望使用最小二乘法估计ab。 我们假设有Y=[y1 ; y2]
 A=[x1 1; x2 1]Y=A*[a;b]

根据最小二乘法: B=[a;b]=( transpose(A)*A )^-1*transpose(A)*Y

  1. (A'*A) \ A'*YA\Y是一样的吗?

  2. 这是计算B的最佳方法:

    inv( transpose(A)*A ) *transpose(A)*Y

    (transpose(A)*A) \ transpose(A)*Y

    (A'*A) \ A'*Y

    pinv(A)*Y(计算伪逆矩阵)

  3. 以上所有结果略有不同

1 个答案:

答案 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代码解释器也明确说明了这一点。函数后跟乘法(应该用橙色警告突出显示):

Warning

这也部分回答了你的第二个问题,但让我们做一个详尽的基准测试。我放弃了使用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();

鉴于这三种方法具有相同的准确性......第一种方法是迄今为止,显然是最快的方法。