【问题标题】:Python Inverse of a Matrix矩阵的 Python 逆
【发布时间】:2010-09-17 16:35:24
【问题描述】:

如何在 python 中求逆矩阵?我自己实现了它,但它是纯 python,我怀疑那里有更快的模块可以做到这一点。

【问题讨论】:

标签: python algorithm matrix linear-algebra matrix-inverse


【解决方案1】:

很遗憾,这里再次重复的所选矩阵要么是奇异的,要么是不良条件的:

A = matrix( [[1,2,3],[11,12,13],[21,22,23]])

根据定义,A 的逆矩阵乘以矩阵 A 本身必须给出一个单位矩阵。在广受赞誉的解释中选择的 A 并没有做到这一点。事实上,只看倒数就可以看出倒数不能正常工作。看看各个项的大小 - 与原始 A 矩阵的项相比,它们非常非常大......

值得注意的是,人类在选择矩阵示例时经常设法选择奇异矩阵!

我确实对解决方案有疑问,因此请进一步研究。在ubuntu-kubuntu平台上,debian包numpy没有matrix和linalg子包,所以除了导入numpy,还需要导入scipy。

如果 A 的对角项乘以一个足够大的因子,比如 2,则矩阵很可能不再是奇异的或接近奇异的。所以

A = matrix( [[2,2,3],[11,24,13],[21,22,46]])

既不是单数也不是近乎单数,并且该示例给出了有意义的结果...在处理浮点数时,必须注意不可避免的舍入误差的影响。

【讨论】:

  • 也可以检查 A==A.I.I 以验证结果
  • 问题是人类通过在行中输入简单的算术级数来“随机”选择矩阵,例如 1、2、3 或 11、12、13。问题是,如果你至少有像这样的三行,它们总是线性相关的。
【解决方案2】:

对于像我这样正在寻找不涉及 pandasnumpy 的纯 Python 解决方案的人,请查看以下 GitHub 项目:https://github.com/ThomIves/MatrixInverse

它慷慨地很好地解释了这个过程是如何“幕后”的。作者很好地描述了循序渐进的方法,并提供了一些实际示例,所有这些都易于理解。

这只是一个小代码 sn-p 从那里非常简要地说明该方法(AM 是源矩阵,IM 是相同大小的单位矩阵):

def invert_matrix(AM, IM):
    for fd in range(len(AM)):
        fdScaler = 1.0 / AM[fd][fd]
        for j in range(len(AM)):
            AM[fd][j] *= fdScaler
            IM[fd][j] *= fdScaler
        for i in list(range(len(AM)))[0:fd] + list(range(len(AM)))[fd+1:]:
            crScaler = AM[i][fd]
            for j in range(len(AM)):
                AM[i][j] = AM[i][j] - crScaler * AM[fd][j]
                IM[i][j] = IM[i][j] - crScaler * IM[fd][j]
    return IM

但是请务必遵循整个过程,您将学到的不仅仅是复制粘贴此代码!还有一个 Jupyter 笔记本,顺便说一句。

希望对某人有所帮助,我个人发现它对于我无法使用任何非标准软件包的非常特殊的任务 (Absorbing Markov Chain) 非常有用。

【讨论】:

    【解决方案3】:

    如果你做矩阵操作,你应该看看numpy。这是一个主要用C语言编写的模块,比纯python编程要快得多。这是一个如何反转矩阵以及进行其他矩阵操作的示例。

    from numpy import matrix
    from numpy import linalg
    A = matrix( [[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix.
    x = matrix( [[1],[2],[3]] )                  # Creates a matrix (like a column vector).
    y = matrix( [[1,2,3]] )                      # Creates a matrix (like a row vector).
    print A.T                                    # Transpose of A.
    print A*x                                    # Matrix multiplication of A and x.
    print A.I                                    # Inverse of A.
    print linalg.solve(A, x)     # Solve the linear equation system.
    

    您还可以查看array 模块,当您只需要处理一种数据类型时,它是一种更有效的列表实现。

    【讨论】:

    • numpy 也出现在《美丽的代码》一书中。 :-)
    • 这里还要注意,没有发生反转,系统是直接解决的,根据 John D. Cook 的回答。
    • 考虑使用 numpy arrays instead of matrices。与numpy.linalg 一起,您几乎可以得到您想要的一切,而无需使用笨重的numpy.matrix
    【解决方案4】:

    Numpy 适合大多数人,但你也可以使用matrices in Sympy

    尝试在http://live.sympy.org/ 运行这些命令

    M = Matrix([[1, 3], [-2, 3]])
    M
    M**-1
    

    为了好玩,试试M**(1/2)

    【讨论】:

    • 我发现numpy.linalg 对包含大整数的矩阵给出了不精确的结果,而sympy 的结果是精确的。 +1
    • 在近似精度下,Sympy 是一个很好的实时终端。我检查了命令(M**-1)*M,它给出了单位矩阵(不完全但非常接近)
    【解决方案5】:

    您可以计算递归矩阵的行列式 然后形成邻接矩阵

    Here is a short tutorial

    我认为这只适用于方阵

    计算这些的另一种方法涉及 gram-schmidt 正交化然后转置矩阵,正交化矩阵的转置是它的逆矩阵!

    【讨论】:

      【解决方案6】:

      确保您确实需要反转矩阵。这通常是不必要的,并且可能在数值上不稳定。当大多数人问如何对矩阵求逆时,他们真的很想知道如何求解 Ax = b,其中 A 是矩阵,x 和 b 是向量。使用直接为 x 求解方程 Ax = b 的代码比计算 A 逆然后将逆乘以 B 更有效和更准确。即使您需要为许多 b 值求解 Ax = b,这也不是一个好主意反转 A。如果您必须求解多个 b 值的系统,请保存 A 的 Cholesky 分解,但不要反转它。

      Don't invert that matrix

      【讨论】:

      • 如果我的矩阵成员是完全有理数怎么办?似乎避免了准确性问题,尽管当然以使性能问题变得更糟为代价。
      【解决方案7】:

      如果您讨厌 numpy,请取出 RPy 和您的本地 R 副本,并改用它。

      (我也会回应让您确实需要反转矩阵。例如,在 R 中,linalg.solve 和 solve() 函数实际上并没有进行完全反转,因为它是不必要的。)

      【讨论】:

      • 从未使用过 R,但为什么外部程序及其 Python 绑定器会比最著名的 Python 科学包更好?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多