我尝试使用以下方法在 scipy 中解决线性最小二乘问题 Ax = b:
x = numpy.linalg.inv(A.T.dot(A)).dot(A.T).dot(b) #Usually not recommended
和
x = numpy.linalg.lstsq(A, b)
两者都给出几乎相同的结果。我还尝试使用 QR 算法手动执行此操作,即:
Qmat, Rmat = la.qr(A)
bpr = dot(Qmat.T,b)
n=len(bpr)
x = np.zeros(n)
for i in xrange(n-1, -1,-1):
x[i] = bpr[i]
for j in xrange(i+1, n):
x[i] -= Rmat[i, j]*x[j]
x[i] /= Rmat[i,i]
然而,这种方法给出了非常不准确的结果(大约 1e-2 的错误)。我在代码或数学上犯了 n00b 错误吗?或者,是方法的问题,还是 scipy 本身的问题?
我的 numpy 版本是 1.6.1(来自http://www.lfd.uci.edu/~gohlke/pythonlibs/的 mkl 编译版本),在 x86_64 上使用 Python 2.7.3。