繁体   English   中英

在 Matlab 中使用最小二乘法进行参数估计

[英]Parameters Estimation using Least Square Method in Matlab

我有下一个问题:考虑一组方程y=ax+b ,其中我知道 y 和 x 并想使用最小二乘法估计ab 让我们假设有Y=[y1 ; y2] Y=[y1 ; y2]
A=[x1 1; x2 1] 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 (计算伪逆矩阵)

以上所有给出的结果略有不同

在解决您的疑问之前,必须进行评论。 当您想使用速记运算符转置矩阵时……您不应该使用' ,而是.' . 第一个是共轭转置的速记运算符,而第二个是用于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准确,如果您将对inv函数的调用悬停在乘法之后,即使 Matlab 代码解释器也清楚地说明了这一点(应标有橙色警告突出显示):

警告

这也部分回答了您的第二个问题,但让我们做一个详尽的基准测试。 我放弃了使用inv(A.' * A) * A.' * Y执行的计算 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();

这是基准测试的结果:

Elapsed time is 0.187067 seconds.
Elapsed time is 2.987651 seconds.
Elapsed time is 2.173117 seconds.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM