【问题标题】:Differences between R's and Numpy's QR decompositionR 和 Numpy 的 QR 分解的区别
【发布时间】:2020-03-01 23:23:27
【问题描述】:

我正在研究一个大型 R (v3.6.0) 代码库并试图了解它在做什么。为此,我使用 Numpy (v1.14.3) 将一些 R 代码翻译成 Python (v3.6.5)。我有一段看起来运行良好的 R 代码:

> v<-c(1,1,1,1)
> qrout<-qr(v)
> qr.Q(qrout)
     [,1]
[1,] -0.5
[2,] -0.5
[3,] -0.5
[4,] -0.5
> qr.R(qrout)
     [,1]
[1,]   -2

Python 等价物很好:

>>> import numpy as np
>>> v=np.ones(4)
>>> v
array([1., 1., 1., 1.])
>>> np.linalg.qr(v)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/python/3.6.5/lib/python3.6/site-packages/numpy/linalg/linalg.py", line 753, in qr
    _assertRank2(a)
  File "/opt/python/3.6.5/lib/python3.6/site-packages/numpy/linalg/linalg.py", line 195, in _assertRank2
    'two-dimensional' % a.ndim)
numpy.linalg.linalg.LinAlgError: 1-dimensional array given. Array must be two-dimensional

查看文档,似乎在 R 中使用 LAPACK 的 DQRDC(2)/DGEQP3/ZGEQP3,而 Numpy 使用 LAPACK 的 dgeqrfzgeqrfdorgqrzungqr。显然 R 对一维矩阵很满意,而 Numpy 则不然。

问题

如何使用 Numpy 复制 R 的 QR 分解?

【问题讨论】:

    标签: python r numpy


    【解决方案1】:

    如错误信息中所述

    数组必须是二维的 罢工>

    In [7]: qr(v[:,None])                                                                     
    Out[7]: 
    (array([[-0.5],
            [-0.5],
            [-0.5],
            [-0.5]]), array([[-2.]]))
    

    编辑
    下面的代码和上面划线的代码没什么区别,但是谁知道呢……

    In [28]: from numpy.linalg import qr 
        ...: from numpy import ones
    
    In [29]: v = ones(4) ; print(v.shape) ; print(v[:,None].shape) # adding a dimension
    (4,)
    (4, 1)
    
    In [30]: q, r = qr(v[:, None])
    
    In [31]: print(q) ; print() ; print(r)                 
    [[-0.5]
     [-0.5]
     [-0.5]
     [-0.5]]
    
    [[-2.]]
    
    In [32]:
    

    在 Python/Numpy 中,数组只能有一个维度,但 qr 需要一个二维数组。

    例如,在 Python 中,转置不会修改本质上是一维向量的维度。

    In [9]: print(v); print(v.T)                                                              
    [1 1 1 1]
    [1 1 1 1]
    
    [10]: print(v.shape); print((v.T).shape)                                                
    (4,)
    (4,)
    

    在 R 中,qr() 尝试将其输入强制转换为二维数组(矩阵),因此 qr() 为您执行此步骤,而在 Python 中您必须显式执行此步骤。

    向 Numpy 数组添加维度的最惯用方法是在切片对象中使用 None 来表示向其添加虚拟维度。

    【讨论】:

    • @Gregor 谢谢你的澄清。我今晚已经安装了R...我不得不说,当我看到dim(v) 打印NULL 时,我有点困惑。我已尝试按照您的建议编辑我的答案。
    • 似乎np.ones(4) 产生了一个行向量,np.ones([4,1]) 产生了一个列向量。行向量失败(参见上面的问题),列向量成功(尽管与 R 的 qr 分解不同)。这与您的答案有何关系?
    • @irritable_phd_syndrom "np.ones(4) 产生一个行向量" 抱歉,它没有,它产生一个一维数组,行向量是一个二维数组,1行和N 列(请看一下带有转置的示例,当我开始使用 Numpy 时,我很难理解这一点)。 ֎ ֎ ֎ Numpy的结果在什么意义上是不同的?我在这两种情况下都看到了[-1/2,-1/2,-1/2,-1/2][-2]... ֎ ֎ ֎ 适合我的答案吗?你能扩展一下吗?
    • 请展示在 Python 中成功运行的示例,我将接受它作为答案。
    猜你喜欢
    • 2013-11-01
    • 2014-06-09
    • 2021-06-06
    • 1970-01-01
    • 2020-03-28
    • 2013-07-04
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多