15

我正在尝试使用 numpy 或 scipy 在 python 中获取非方阵的左逆。如何将以下 Matlab 代码翻译成 Python?

>> A = [0,1; 0,1; 1,0]

A =

     0     1
     0     1
     1     0

>> y = [2;2;1]

y =

     2
     2
     1

>> A\y

ans =

    1.0000
    2.0000

Matlab中是否有与左逆\运算符等效的numpy或scipy?

4

7 回答 7

10

使用linalg.lstsq(A,y)以来A不是方形的。有关详细信息,请参见此处。您可以使用linalg.solve(A,y)if Ais square ,但不适用于您的情况。

于 2010-02-12T08:20:10.087 回答
2

对于那些希望解决大型稀疏最小二乘问题的人:

我已将 LSQR 算法添加到 SciPy。在下一个版本中,您将能够:

from scipy.sparse import csr_matrix
from scipy.sparse.linalg import lsqr
import numpy as np

A = csr_matrix([[0., 1], [0, 1], [1, 0]])
b = np.array([[2.], [2.], [1.]])

lsqr(A, b)

返回答案[1, 2]

如果你想在不升级 SciPy 的情况下使用这个新功能,你可以lsqr.py从代码库下载

http://projects.scipy.org/scipy/browser/trunk/scipy/sparse/linalg/isolve/lsqr.py

于 2010-03-02T19:21:22.220 回答
2

这是一种适用于稀疏矩阵的方法(您的评论中就是您想要的),它使用优化包中的 leastsq 函数

from numpy import *
from scipy.sparse import csr_matrix
from scipy.optimize import leastsq
from numpy.random import rand

A=csr_matrix([[0.,1.],[0.,1.],[1.,0.]])
b=array([[2.],[2.],[1.]])

def myfunc(x):
    x.shape = (2,1)
    return (A*x - b)[:,0]

print leastsq(myfunc,rand(2))[0]

生成

[ 1.  2.]

这有点难看,因为我必须根据 leastsq 的要求来匹配形状。也许其他人知道如何使它更整洁一些。

我还尝试通过使用 LinearOperators 来使用 scipy.sparse.linalg 中的函数,但无济于事。问题是所有这些函数都只能处理平方函数。如果有人找到这样做的方法,我也想知道。

于 2010-02-12T17:10:54.187 回答
2

您还可以在 中查找伪反函数的等效项pinvnumpy/scipy作为其他答案的替代方案。

于 2010-02-12T14:58:25.423 回答
1

您可以使用矩阵计算来计算左逆:

import numpy as np

linv_A = np.linalg.solve(A.T.dot(A), A.T)

(为什么,因为:

在此处输入图像描述

)

测试:

np.set_printoptions(suppress=True, precision=3)
np.random.seed(123)

A = np.random.randn(3, 2)
print('A\n', A)

A_linv = np.linalg.solve(A.T.dot(A), A.T)
print('A_linv.dot(A)\n', A_linv.dot(A))

结果:

A
 [[-1.086  0.997]
 [ 0.283 -1.506]
 [-0.579  1.651]]
A_linv.dot(A)
 [[ 1. -0.]
 [ 0.  1.]]
于 2017-02-06T11:27:38.207 回答
0

您可以使用 scipy.sparse.linalg 中的 lsqr 来求解具有最小二乘法的稀疏矩阵系统

于 2011-05-10T22:20:29.900 回答
0

我没有测试过,但根据这个网页它是:

linalg.solve(A,y)
于 2010-02-12T08:23:21.157 回答