如何在Matlab中使用最小二乘法?

3

我有37个线性方程和36个变量,以矩阵方程的形式表示为:A*X=B。这些方程没有确切的答案。我想使用Matlab的最小二乘法来找到误差最小的答案。由于我对Matlab不熟悉,所以希望能得到任何建议。谢谢。


5
X=A\b。就这么简单。检查mldivide。 - Ander Biguri
@AnderBiguri,最好把这个变成一个答案。 - A. Donda
哇!!那真的有效!如果我想应用一个条件x(i)>0呢? - nasim
2
@nasim,我认为这是一个线性规划问题。最好先做一些研究,然后再发布另一个问题。 - A. Donda
3个回答

9
如果矩阵 A 的秩为满秩,即矩阵 A 的列线性无关,那么对于一个超定的线性方程组,最小二乘解可以被求出。
A * x = b

可以通过反转正常方程(参见线性最小二乘法)来找到。

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

如果A不是满秩矩阵,那么A' * A就不可逆。相反,可以使用A伪逆矩阵
x = pinv(A) * b

或者Matlab的左除运算符

x = A \ b

两种方法都可以得到相同的解,但是左除法更具有计算效率。

后两种计算方法也可以处理线性方程组的欠定情况,但在这种情况下它们会给出不同的解:伪逆矩阵会给出使 x 的平方和最小的解,而左除法运算符会给出尽可能多的0系数的解。


1
我认为你的 x = inv(A' * A) * A * b 应该是 x = inv(A' * A) * A' * b - Tamás Szabó

5
最常见的解决方法是使用伪逆矩阵:
X = pinv(A) * B;

如果我想应用一个条件 x(i)>0,怎么样? - nasim
2
你需要使用 lsqlin 函数来实现。我相信语法是 x = lsqlin(A,B,[],[],0,inf) - rlbond
2
从计算复杂度和数值稳定性来看,这比使用 mldivide(反斜杠运算符)差。 - knedlsepp
1
mldividepinv在像这个问题一样的超定问题中是等效的,但对于欠定问题,pinv会给出“实际”的最小二乘解(最小能量解)。 - rlbond
2
我同意knedlsepp的观点。如果你只是想解决一个线性系统,计算矩阵的逆(或伪逆)几乎从效率和稳定性的角度来看都不是一个好主意。 - cfh

3
您可以通过以下方式计算x:
x = (A'*A)\A'*B

1
@AnderBiguri 你是对的。我刚刚纠正了它 - 虽然你的答案比我的更简洁。 - Tamás Szabó
2
如果A是可逆的,(A'*A)*inv(A) 提供与 pinv 和反斜杠相同的解决方案。 如果A不可逆,则使用反斜杠的等式仍然有效,但是过于复杂。 - A. Donda
3
当你的问题被表述为一个方程时,你不能对解决方案施加限制。如果你的问题是一个不等式,可以查看Matlab的linprog函数。 - Tamás Szabó
1
@TamásSzabó,我必须再次更正自己。我经常被反斜杠运算符的方向搞混。 - A. Donda
3
只需记住斜杠倾向于哪里。无论它倾向于哪里,就是取反所在的位置... 所以 A\b 中的 \ 倾向于 A,意味着 inv(A)*b(假设满秩),而进行 A/b 意味着 A*inv(b)(同样假设满秩)。我经常会感到困惑,最后通过看斜杠倾向的方向来解决了问题。 - rayryeng
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接