R和Numpy的QR分解之间的差异

时间:2019-11-05 14:48:48

标签: python r numpy

我正在研究大型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的dgeqrfzgeqrf,{{ 1}}和dorgqr。显然,R对一维矩阵感到满意,而Numpy则不满意。

问题

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

1 个答案:

答案 0 :(得分: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表示向其添加了虚拟维。