scipy 在稀疏设计矩阵上用rpy 2运行glmnet?

mbyulnm0  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(147)

我有一个python代码片段,它可以很好地在np.array X和y上运行GLMNET。然而,当X是scipy中的列稀疏矩阵时,代码失败,因为rpy2无法转换X。我犯了一个明显的错误吗?
MCVE是:

import numpy as np
from scipy import sparse
from rpy2 import robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects import numpy2ri
from rpy2.robjects import pandas2ri

if __name__ == "__main__":
    X = sparse.rand(5, 20, density=0.1)
    y = np.random.randn(5)
    numpy2ri.activate()
    pandas2ri.activate()

    utils = rpackages.importr('utils')
    utils.chooseCRANmirror(ind=1) 
    if not rpackages.isinstalled('glmnet'):
        utils.install_packages("glmnet")
    glmnet = rpackages.importr('glmnet')

    glmnet = robjects.r['glmnet']
    glmnet_fit = glmnet(X, y, intercept=False, standardize=False)

字符串
当我运行它时,我得到一个NotImplementedError

Conversion 'py2ri' not defined for objects of type '<class 'scipy.sparse.csc.csc_matrix'>'


我可以用不同的方式提供X吗?如果rpy 2不能处理稀疏矩阵,我会感到惊讶。

q3qa4bjr

q3qa4bjr1#

你可以用rpy 2创建一个稀疏矩阵,如下所示:

import numpy as np
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from scipy import sparse

X = sparse.rand(5, 20, density=0.1).tocoo()
r_Matrix = importr("Matrix")
r_Matrix.sparseMatrix(
    i=ro.IntVector(X.row + 1),
    j=ro.IntVector(X.col + 1),
    x=ro.FloatVector(X.data),
    dims=ro.IntVector(X.shape))

字符串

ukqbszuj

ukqbszuj2#

rpy 2中确实没有包含用于您的对象类型的转换器Python -> R。您的Python对象不是传统的数组,而是您注意到的稀疏矩阵(具体为scipy.sparse.csc.csc_matrix),作为numpy可用的数字扩展之一实现。由于numpy本身甚至不需要使用rpy2,因此对numpy扩展的支持相当稀疏,但pandas是一个明显的例外,因为数据表无处不在。
您可能希望在R软件包Matrixhttps://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/dgCMatrix-class.html)中编写自己的从css_matrixgcCMatrix的转换器,因为软件包glmnet似乎能够处理它们。
编写一个自定义转换器需要如何将Python对象的内容Map或复制到它所选择的R对应对象,但是一旦完成,将代码插入rpy 2应该很容易:https://rpy2.github.io/doc/v2.9.x/html/generated_rst/s4class.html#custom-conversion
考虑在rpy 2问题跟踪器上将一个问题作为“特性请求”打开,并报告进度和结果,希望看到这变成一个完整的单元测试拉取请求。

cigdeys3

cigdeys33#

另外,一个可能有效的快速解决方案是临时保存稀疏矩阵文件。

import numpy as np
import rpy2.robjects as ro
import warnings
from rpy2.rinterface import RRuntimeWarning
import rpy2.robjects.numpy2ri as numpy2ri
from scipy.io import mmwrite
mmwrite('temp.mtx',matrix)
ro.r('X <- readMM("temp.mtx")')

字符串
我会很感兴趣,虽然,如果有人来了一个自定义转换器,以避免复制到磁盘。

fae0ux8s

fae0ux8s4#

python包anndata2ri具有将scipy稀疏矩阵转换为R的函数,反之亦然。

import anndata2ri
anndata2ri.activate()
r_sparse_mat = anndata2ri.scipy2ri.py2rpy(py_sparse_mat)

字符串

相关问题