【问题标题】:Parameters Estimation using Least Square Method in Matlab在 Matlab 中使用最小二乘法进行参数估计
【发布时间】:2018-02-25 01:38:30
【问题描述】:

我有以下问题: 考虑一组方程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(计算伪逆矩阵)

以上所有的结果都略有不同

【问题讨论】:

    标签: matlab least-squares


    【解决方案1】:

    在解决您的疑问之前,必须备注。当您想使用速记运算符转置矩阵时...您不应使用',而应使用.'。第一个是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 函数后跟一个乘法(应该用橙色警告突出显示):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2019-10-24
      • 2011-09-16
      • 2016-04-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多