在稀疏设计矩阵上运行带有rpy2的glmnet?

问题描述 投票:0回答:3

我有一个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吗?如果rpy2无法处理稀疏矩阵,我会感到惊讶。

python scipy sparse-matrix rpy2 glmnet
3个回答
1
投票

确实没有转换器Python - > R作为rpy2中包含的对象类型。你的Python对象不是传统的数组,而是一个稀疏的矩阵,你会注意到它(scipy.sparse.csc.csc_matrix是特定的),实现为numpy可用的数字扩展之一。由于numpy本身甚至不需要使用rpy2,因为数据表无处不在,因此pandas的明显例外是对numpy扩展的支持相当稀疏。

您可能想在q包xazxswpoi(css_matrix)中将自己的转换器从gcCMatrix编写到Matrix,因为包https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/dgCMatrix-class.html似乎能够处理它们。

编写自定义转换器将需要如何将Python对象的内容映射或复制到其选定的R对应物,但是一旦完成将代码插入rpy2应该很容易:glmnet

考虑在rpy2问题跟踪器上打开一个问题作为“功能请求”,并报告进度和结果,希望看到这转变为完成单元测试的拉取请求


0
投票

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

https://rpy2.github.io/doc/v2.9.x/html/generated_rst/s4class.html#custom-conversion

我会非常感兴趣,如果有人带有自定义转换器来避免复制到磁盘。


0
投票

您可以使用rpy2创建稀疏矩阵,如下所示:

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")')
© www.soinside.com 2019 - 2024. All rights reserved.