python - R 和 Numpy 的 QR 分解的区别
问题描述
我正在研究一个大型 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 的dgeqrf
、zgeqrf
、dorgqr
和zungqr
。显然,R 对一维矩阵很满意,而 Numpy 则不然。
问题
如何使用 Numpy 复制 R 的 QR 分解?
解决方案
如错误消息中所述
数组必须是二维的
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
在切片对象中使用以表示向其添加虚拟维度。
推荐阅读
- google-cloud-platform - GCP 多个外部静态 IP 地址到 Instance VM 别名 IP NIC0
- css - 如何添加下拉菜单
- c# - 无法从 MySql 数据库填充数据网格视图
- unity3d - unity Cinemachine 如何锁定 Y 轴?
- python - Pymongo 仅包含以名称开头的字段
- angular - 角材料表折叠/展开完整表,因此只有标题可见
- javascript - 一次调用两个函数
- flutter - Flutter 如何使用 Provider 和 get_it 包
- python-3.x - 用于 Python 中并行 IO 操作的 Ray 库
- r - 如何在R中的括号外用逗号分隔行