Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有稀疏特征矩阵的R中的大规模回归_R_Sparse Matrix_Regression - Fatal编程技术网

具有稀疏特征矩阵的R中的大规模回归

具有稀疏特征矩阵的R中的大规模回归,r,sparse-matrix,regression,R,Sparse Matrix,Regression,我想在R中使用许多(例如100k)特征进行大规模回归(线性/逻辑),其中每个示例在特征空间中相对稀疏——例如,每个示例约1k个非零特征 似乎包slm应该可以做到这一点,但我很难将sparseMatrix格式转换为slm友好格式 我在{0,1}中有一个标签y的数字向量和一个sparseMatrix的特征X\。当我尝试 model <- slm(y ~ X) 大概是因为slm想要一个SparseM对象而不是sparseMatrix 有没有简单的方法可以a)直接填充SparseM对象,或者b)

我想在R中使用许多(例如100k)特征进行大规模回归(线性/逻辑),其中每个示例在特征空间中相对稀疏——例如,每个示例约1k个非零特征

似乎包
slm
应该可以做到这一点,但我很难将
sparseMatrix
格式转换为
slm
友好格式

我在{0,1}中有一个标签
y
的数字向量和一个
sparseMatrix
的特征
X
\。当我尝试

model <- slm(y ~ X)
大概是因为
slm
想要一个
SparseM
对象而不是
sparseMatrix

有没有简单的方法可以a)直接填充
SparseM
对象,或者b)将
sparseMatrix
转换为
SparseM
对象?或者也许有更好/更简单的方法来做到这一点


(我想我可以使用
X
y
明确地为线性回归的解决方案编码,但是如果
slm
能够工作那就太好了。)

我不知道
SparseM
但是
矩阵模型
包有一个未报告的
lm.fit.sparse
函数,您可以使用。请参见
?矩阵模型:::lm.fit.sparse
。以下是一个例子:

创建数据:

y <- rnorm(30)
x <- factor(sample(letters, 30, replace=TRUE))
X <- as(x, "sparseMatrix")
class(X)
# [1] "dgCMatrix"
# attr(,"package")
# [1] "Matrix"
dim(X)
# [1] 18 30
作为比较:

lm(y~x-1)

# Call:
# lm(formula = y ~ x - 1)
# 
# Coefficients:
#       xa        xb        xd        xe        xf        xg        xh        xj  
# -0.17500  -0.89293  -0.43585   0.17233  -0.11900   0.56610   1.19655  -1.66784  
#       xm        xq        xr        xt        xu        xv        xw        xx  
# -0.28512  -0.11859  -0.04038   0.04827  -0.06039  -0.46127  -1.22106  -0.48729  
#       xy        xz  
# -0.28524   1.81682  

您也可以通过查看此处获得一些里程数:

  • 包裹
  • 这个
  • 一篇关于(PDF)的论文,作者Martin Machler和Douglas Bates,来自用户2010

迟来的回答:
glmnet
还将支持稀疏矩阵和所需的两种回归模型。这可以使用
矩阵
包生成的稀疏矩阵。我建议通过这个软件包研究正则化模型。由于稀疏数据通常涉及对某些变量的非常稀疏的支持,L1正则化可用于将这些变量从模型中剔除。对于支持度非常低的变量,它通常比获得一些非常虚假的参数估计更安全。

glmnet
是一个不错的选择。支持线性、逻辑和多项式回归的L1、L2正则化,以及其他选项

唯一的细节是它没有公式接口,因此您必须创建模型矩阵。但这就是收益所在

下面是一个伪示例:

library(glmnet)
library(doMC)
registerDoMC(cores=4)

y_train <- class
x_train <- sparse.model.matrix(~ . -1, data=x_train)

# For example for logistic regression using L1 norm (lasso) 
cv.fit <- cv.glmnet(x=x_train, y=y_train, family='binomial', alpha=1, 
                    type.logistic="modified.Newton", type.measure = "auc",
                    nfolds=5, parallel=TRUE)

plot(cv.fit)
库(glmnet)
图书馆(doMC)
寄存器DOMC(核心=4)

你对我来说很奇怪,看到一个作为公认答案而提出的未报告函数的使用,即使是一个带有帮助页面的未报告函数也是很奇怪的!你确定你要写
x\u train=…(data=x\u train)
?同样值得注意的是,对于那些没有尝试正规化的人,这里的建议将是有用的:这里有一些幻灯片,也许这是有意的?这看起来很有希望:在这里
lm(y~x-1)

# Call:
# lm(formula = y ~ x - 1)
# 
# Coefficients:
#       xa        xb        xd        xe        xf        xg        xh        xj  
# -0.17500  -0.89293  -0.43585   0.17233  -0.11900   0.56610   1.19655  -1.66784  
#       xm        xq        xr        xt        xu        xv        xw        xx  
# -0.28512  -0.11859  -0.04038   0.04827  -0.06039  -0.46127  -1.22106  -0.48729  
#       xy        xz  
# -0.28524   1.81682  
library(glmnet)
library(doMC)
registerDoMC(cores=4)

y_train <- class
x_train <- sparse.model.matrix(~ . -1, data=x_train)

# For example for logistic regression using L1 norm (lasso) 
cv.fit <- cv.glmnet(x=x_train, y=y_train, family='binomial', alpha=1, 
                    type.logistic="modified.Newton", type.measure = "auc",
                    nfolds=5, parallel=TRUE)

plot(cv.fit)