【问题标题】:Condition number of a matrix using numpy使用 numpy 的矩阵的条件数
【发布时间】:2017-12-21 17:17:41
【问题描述】:

[python 2.7 和 numpy v1.11.1] 我正在查看矩阵条件数,并尝试在不使用函数 np.linalg.cond() 的情况下计算矩阵的条件数。

根据 numpy 的文档,矩阵条件数的定义是“x 的范数乘以 x 的倒数的范数”。

||X|| * ||X^-1||

对于矩阵

a = np.matrix([[1, 1, 1],
               [2, 2, 1],
               [3, 3, 0]])

print np.linalg.cond(a)

1.84814479698e+16

print np.linalg.norm(a) * np.linalg.norm(np.linalg.inv(a))

2.027453660713377e+17

我的计算错误在哪里?

谢谢!

【问题讨论】:

  • 矩阵奇异 - 0 det, inf inverse 等
  • 无法复制。当我调用 inv(a) 时,我的 Python/Numpy 会引发 LinAlgError("Singular matrix")

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


【解决方案1】:

您正在尝试使用 Frobenius 范数定义来计算条件。这是条件计算的可选参数。

print(np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a)))
print(np.linalg.cond(a, p='fro'))

生产

2.02745366071e+17
2.02745366071e+17

【讨论】:

    【解决方案2】:

    norm矩阵默认使用Frobenius范数,cond使用2-范数时:

    In [347]: np.linalg.cond(a)
    Out[347]: 38.198730775206172
    
    In [348]:np.linalg.norm(a,2)*np.linalg.norm(np.linalg.inv(a),2)
    Out[348]: 38.198730775206243
    
    In [349]: np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a))
    Out[349]: 39.29814570824248
    

    【讨论】:

    • 我不知道np.linalg.norm了解运营商规范! (+1)
    • 谢谢,这个解释很有帮助!但是,我发现np.linalg.cond(a,2) = np.linalg.norm(a,2)*np.linalg.norm(np.linalg.inv(a),2) != np.linalg.cond(a)
    • 只是四舍五入的问题。可能操作不完全按照相同的顺序完成。
    【解决方案3】:

    NumPy cond() 目前有问题。有一段时间我们会修复它,但现在如果您对线性方程解进行此操作,您可以使用 SciPy linalg.solve,如果倒数条件数低于阈值并且什么都没有,它将产生精确奇点错误或警告如果数组是可逆的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多