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

标签 matlab least-squares

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

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

  1. (A'*A)\A'*YA\Y 相同吗?

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

    inv( 转置(A)*A ) *转置(A)*Y

    (转置(A)*A)\转置(A)*Y

    (A'*A)\A'*Y

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

以上所有结果都略有不同

最佳答案

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

Warning

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

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

关于matlab - Matlab中使用最小二乘法进行参数估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48969412/

相关文章:

java - 在 Linux 中使用 MATLAB (Windows) 生成的 Java 包

python - 给定雅可比行列式时,Scipy 的 curve_fit/leastsq 会变慢吗?

python - 最小二乘曲线拟合

matlab - 是否可以在 matlab 中对二值图像的单个连通分量进行着色?

python - 平面拟合到 4 个(或更多)XYZ 点

python - 使用 Numba 在 Python 中求解最小二乘法

c++ - 如何插入从 Kinect 计算的 3D 点以获得球轨迹?

matlab - 如何在匿名函数中使用条件

matlab - AlexNet 层提取了哪些特征?

algorithm - 取景器对齐