【问题标题】:Python numpy matrix inverse gives incorrect valuesPython numpy 矩阵逆给出不正确的值
【发布时间】:2020-01-12 22:01:49
【问题描述】:

我得到了什么:

>>> Pp
matrix([[ 0.01011  ,  0.0050535,  0.0010005],
        [ 0.0050535,  0.002526 ,  0.0005001],
        [ 0.0010005,  0.0005001,  0.0001   ]])
>>> Pp.I
matrix([[  4.73894021e+17,  -9.47740572e+17,  -1.65931645e+15],
        [ -9.47740572e+17,   1.89538621e+18,   3.31846669e+15],
        [ -1.65931645e+15,   3.31846669e+15,   5.81001542e+12]])

我认为我应该得到什么:

matrix([[ -1.11110667e+09,   2.22220000e+09,   3.40000000e+06],
        [  2.22220000e+09,  -4.44433334e+09,  -7.00000001e+06],
        [  3.40000000e+06,  -7.00000001e+06,   1.00000000e+06]])

我是否错误地使用了逆?

顺便说一句,这也是不正确的:

>>> np.linalg.inv(Pp)
matrix([[  4.73894021e+17,  -9.47740572e+17,  -1.65931645e+15],
        [ -9.47740572e+17,   1.89538621e+18,   3.31846669e+15],
        [ -1.65931645e+15,   3.31846669e+15,   5.81001542e+12]])

我看到另一篇关于此的帖子,但没有明确的解决方案。

【问题讨论】:

  • 乘以我认为是正确的逆:[[1.00000000867928,0.000000036475688,0.000000000019985] [0.000000003684588,1.00000001835584,0.000000000009159] [0.000000000829513,0.00000000338152,1.00000000000165]] 跨度>
  • 乘以逆那Pp.I给出:[[1425599774.99986,-2844761654.99971,-4971157.28804637] [926094855.000069,-1848950331.00014,-3232423.45800024] [-23691699.8982929,48003999.7965857,84985.9995117466] 跨度>
  • 我试过了,它给了我正确的逆。
  • 你使用的是 NumPy 的 matrix 类型吗?
  • >>> type(Pp)

标签: python numpy matrix inverse


【解决方案1】:

通过简单的复制粘贴,我得到了正确的值 - 两种方式:

In [82]: [[ 0.01011  ,  0.0050535,  0.0010005], 
    ...:         [ 0.0050535,  0.002526 ,  0.0005001], 
    ...:         [ 0.0010005,  0.0005001,  0.0001   ]]                                                    
Out[82]: 
[[0.01011, 0.0050535, 0.0010005],
 [0.0050535, 0.002526, 0.0005001],
 [0.0010005, 0.0005001, 0.0001]]
In [83]: np.linalg.inv(_)                                                                                 
Out[83]: 
array([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
       [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
       [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])
In [84]: mm = np.matrix(_82)                                                                              
In [85]: mm.I                                                                                             
Out[85]: 
matrix([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
        [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
        [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])

在干净的会话中尝试您的Pp;你的会话出了点问题。或者您显示的 Pp 不是您实际使用的那个。

【讨论】:

    【解决方案2】:

    先用np.linalg.det(m)看矩阵的行列式。结果是-2.249999999256419e-18,接近于 0。
    理论上你可以说这个矩阵是可逆的,但由于条件数很高(使用np.linalg.cond(m)),你可能会得到非常糟糕的结果。
    尝试像这样构建矩阵:

    m = np.matrix([[ 0.01011  ,  0.0050535,  0.0010005],
            [ 0.0050535,  0.002526 ,  0.0005001],
            [ 0.0010005,  0.0005001,  0.0001   ]], dtype=np.float64)
    

    这确实会为m.I 带来更好的结果:

    matrix([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
            [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
            [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])
    

    用m * m.I检查结果:

    matrix([[ 1.00000000e+00,  8.19379276e-10,  6.10730759e-12],
            [-1.18821050e-10,  1.00000000e+00,  3.87522234e-12],
            [ 1.48254137e-11, -6.72848576e-11,  1.00000000e+00]])
    

    【讨论】:

      【解决方案3】:

      我在定义矩阵时犯了一个错误。

      我是这样定义的:

      Pp=np.matrix([(x11,x12,x13),(x21,x22,x23),(x31,x32,x33)])
      

      而不是正确的方式,即:

      Pp=np.matrix([[x11,x12,x13],[x21,x22,x23],[x31,x32,x33]])
      

      有趣的是,除了逆向之外,一切都正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        相关资源
        最近更新 更多