【问题标题】:Left inverse in numpy or scipy?numpy或scipy的左逆?
【发布时间】:2011-01-16 01:31:03
【问题描述】:

我正在尝试使用 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?

【问题讨论】:

标签: python matlab numpy linear-algebra matrix-inverse


【解决方案1】:

使用linalg.lstsq(A,y),因为A 不是正方形。有关详细信息,请参阅here。如果A 是方形的,你可以使用linalg.solve(A,y),但你的情况不是。

【讨论】:

  • 我使用的是 scipy.sparse 模块,A 是一个稀疏矩阵。如果 A 是稀疏的,linalg.lstsq(A,y) 是否有效?
  • 好吧,你可以做scipy.linalg.lstsq(A.todense(),y.todense()),但由于速度或内存的原因,这可能不是一个选项。不确定 lstsq 是否直接在稀疏矩阵上。这个线程可能会感兴趣:mail.scipy.org/pipermail/scipy-user/2008-November/018793.html
【解决方案2】:

我没有测试过,但是根据this web page是:

linalg.solve(A,y)

【讨论】:

  • 这就是我的想法,但 matlab 中的 ` \ ` 仅在 A 是方阵时才会这样做。在这种情况下,您必须使用 linalg.lstsq,如 Ramashalanka 所说。
【解决方案3】:

您还可以在 numpy/scipy 中寻找与伪反函数 pinv 等效的方法,以替代其他答案。

【讨论】:

    【解决方案4】:

    这是一种适用于稀疏矩阵(来自您的 cmets 就是您想要的)的方法,它使用优化包中的 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 中的函数,但无济于事。问题是所有这些函数都只能处理平方函数。如果有人找到这样做的方法,我也想知道。

    【讨论】:

      【解决方案5】:

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

      我已将 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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          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.]]
          

          【讨论】:

          • 添加到“因为”: np.linalg.solve() 找到 x 使得 A.T.dot(A).dot(x)= A.T ;将其替换为解释中的第二个 A.T 会导致: inverse(A.T.dot(A)).dot(A.T.dot(A).dot(x)).dot(A)=I ;它遵循 x.dot(A)=I,即 x=inverse(A)
          猜你喜欢
          • 2012-10-27
          • 1970-01-01
          • 1970-01-01
          • 2017-05-25
          • 2018-02-22
          • 2017-11-27
          • 2012-03-21
          • 1970-01-01
          相关资源
          最近更新 更多