【问题标题】:Why Numpy and Scipy QR decomposition give me different values?为什么 Numpy 和 Scipy QR 分解给我不同的值?
【发布时间】:2021-06-06 05:00:01
【问题描述】:

我有以下向量。

x = np.array([[ 0.87695113],
              [ 0.3284933 ],
              [-0.35078323]])

当我调用 qr 的 numpy 版本时

from numpy.linalg import qr as qr_numpy
qr_numpy(x)

我得到

(array([[-0.87695113],
        [-0.3284933 ],
        [ 0.35078323]]), array([[-1.]]))

而当我运行 scipy 版本时,我得到了完全不同的东西。

from scipy.linalg import qr as qr_scipy
qr_scipy(x)

有输出

(array([[-0.87695113, -0.3284933 ,  0.35078323],
        [-0.3284933 ,  0.94250897,  0.06139208],
        [ 0.35078323,  0.06139208,  0.93444215]]), array([[-1.],
        [ 0.],
        [ 0.]]))

发生了什么事??

【问题讨论】:

    标签: python numpy scipy linear-algebra lapack


    【解决方案1】:

    numpy.linalg.qr() 的默认 mode'reduced',而 scipy.linalg.qr() 的默认 'full'

    因此,要获得相同的结果,请使用 'economic' 用于 scipy-qr 或使用 'complete' 用于 numpy-qr:

    from numpy.linalg import qr as qr_numpy
    qr_numpy(x)
    
    (array([[-0.87695113],
            [-0.3284933 ],
            [ 0.35078323]]),
     array([[-1.]]))
    

    与 scipy-qr 的输出匹配:

    from scipy.linalg import qr as qr_scipy
    qr_scipy(x, mode='economic')
    
    (array([[-0.87695113],
            [-0.3284933 ],
            [ 0.35078323]]),
     array([[-1.]]))
    

    要同时获得“完整”版本:

    from numpy.linalg import qr as qr_numpy
    qr_numpy(x, mode='complete')
    
    (array([[-0.87695113, -0.3284933 ,  0.35078323],
            [-0.3284933 ,  0.94250897,  0.06139208],
            [ 0.35078323,  0.06139208,  0.93444215]]),
     array([[-1.],
            [ 0.],
            [ 0.]]))
    
    from scipy.linalg import qr as qr_scipy
    qr_scipy(x)
    
    (array([[-0.87695113, -0.3284933 ,  0.35078323],
            [-0.3284933 ,  0.94250897,  0.06139208],
            [ 0.35078323,  0.06139208,  0.93444215]]),
     array([[-1.],
            [ 0.],
            [ 0.]]))
    

    【讨论】:

    • 谢谢!您是否有任何资源可以了解它们之间的区别?另外我刚刚注意到,如果我使用 numpy 中的svd,我会得到相同的结果,但速度要快 3 倍
    • @Euler_Salter 实际上,要找到您问题的答案,我只是阅读了答案中链接的两个函数的文档。我以前没有使用过它们 :-) numpy 文档对这些方法有一些注释。 scipy 文档提到 “这是 LAPACK 例程 dgeqrf、zgeqrf、dorgqr、zungqr、dgeqp3 和 zgeqp3 的接口。” 也许 wiki 会为您提供有关它的更多信息:QR decomposition
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2014-06-09
    • 2018-04-28
    • 2014-10-18
    • 2019-10-04
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多