【问题标题】:How to use least squares method in Matlab?Matlab中如何使用最小二乘法?
【发布时间】:2020-06-01 19:56:17
【问题描述】:

我有37个线性方程和36个矩阵方程形式的变量; A*X=B。方程没有确切的答案。我想使用 Matlab 最小二乘法找到误差最小的答案。我是 Matlab 的新手,所以任何 cmets 都会有所帮助。谢谢

【问题讨论】:

  • X=A\b。就这么简单。检查mldivide
  • @AnderBiguri,最好把这个作为答案。
  • 哇!!那确实奏效了!如果我想应用 x(i)>0 的条件怎么样?
  • @nasim,我认为这是一个linear programming 问题。最好在先做一些研究之后再发布一个关于此的问题

标签: matlab math curve-fitting least-squares best-fit-curve


【解决方案1】:

如果A 是满秩的,即A 的列是线性独立的,则超定线性方程组的最小二乘解

A * x = b

可以通过反转正规方程得到(参见Linear Least Squares):

x = inv(A' * A) * A' * b

如果A 不是满秩,A' * A 是不可逆的。相反,可以使用pseudoinverseA

x = pinv(A) * b

或 Matlab 的 left-division 运算符

x = A \ b

两者都给出相同的解决方案,但左除法的计算效率更高。

后两种计算方法也可以处理确定的线性方程组,但在这种情况下它们给出了不同的解:伪逆给出了x 具有最小平方和的解, 而左除算子给出了一个系数尽可能多为 0 的解。

【讨论】:

  • 我觉得你的x = inv(A' * A) * A * b应该是x = inv(A' * A) * A' * b
【解决方案2】:

解决这个问题的最通用方法是使用伪逆:

X = pinv(A) * B;

【讨论】:

  • 如果我想应用一个条件 x(i)>0
  • 您需要 lsqlin 函数。我相信语法是x = lsqlin(A,B,[],[],0,inf)
  • 就计算复杂度和数值稳定性而言,这在数值上不如使用mldivide(反斜杠运算符)。
  • mldividepinv 对于像这个问题这样的超定问题是等价的,但是对于一个欠定问题pinv 给出了“实际的”最小二乘解决方案(最小能量解决方案)。
  • 我同意 knedlsepp。如果出于效率和稳定性的原因,您只想求解线性系统,那么计算矩阵逆(或伪逆)几乎不是一个好主意。
【解决方案3】:

您可以通过以下方式计算 x:

x = (A'*A)\A'*B

【讨论】:

  • @AnderBiguri 你是对的。我刚刚更正了它 - 虽然你的答案比我的更紧凑。
  • 此表达式仅在 A 具有完整列排名时才正确。 pinv 更笼统。
  • @TamásSzabó,如果 A 是可逆的,(A'*A)*inv(A) 给出与pinv 和反斜杠相同的解决方案。如果 A 不可逆,则使用反斜杠的方程仍然有效,但不必要地复杂。
  • @nasim 当您的问题被表述为方程式时,您不能对解决方案施加约束。如果您的问题是不等式,请查看 matlab 的 linprog 函数
  • @A.Donda - 记住斜线的学习方向。无论它在哪里倾斜,这就是逆向的地方......所以A\b与`\`倾向于A意味着inv(A)*b(假设满秩)并且做A/b意味着A*inv(b)(也假设满级)。我一直很困惑,最后我只看斜线倾斜的方向就搞定了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2023-04-04
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多