Matlab中最小二乘法参数估计

Matlab中最小二乘法参数估计,matlab,least-squares,Matlab,Least Squares,我有以下问题: 考虑一组方程 y= AX+B,在这里我知道Y和X,并希望用最小二乘法估计 A代码> B>代码>。 让我们假设有Y=[y1;y2]和 A=[x11;x21]因此Y=A*[A;b] 根据最小二乘法: B=[a;B]=(转置(a)*a)^-1*转置(a)*Y (A'*A)\A'*Y和A\Y是相同的吗 哪种方法是计算B的最佳方法: inv(转置(A)*A)*转置(A)*Y (转置(A)*A)\transpose(A)*Y (A'*A)\A'*Y pinv(A)*Y(计算伪逆矩阵) 所有这

我有以下问题: 考虑一组方程<代码> y= AX+B<代码>,在这里我知道Y和X,并希望用最小二乘法估计<代码> A<代码>代码> B>代码>。 让我们假设有
Y=[y1;y2]

A=[x11;x21]
因此
Y=A*[A;b]

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

  • (A'*A)\A'*Y
    A\Y
    是相同的吗

  • 哪种方法是计算B的最佳方法:

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

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

    (A'*A)\A'*Y

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


  • 所有这些给出的结果稍有不同

    在解决您的疑问之前,必须进行备注。当您要使用速记运算符转置矩阵时。。。您不应该使用
    ,而应该使用
    。第一个是的速记运算符,而第二个是用于的正确速记运算符。虽然它们通常会产生相同的结果,但将前者与包含复数的矩阵一起使用可能会打乱您的计算

    由于您没有提供数据示例,以下是我为测试部署的设置:

    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执行的计算,因为建议避免使用它。我们开始:

    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.
    
    鉴于这三种方法具有相同的精确度。。。第一个是目前为止最快的