R glmnet:使用多项式和pmax时的分割错误



我使用glmnet包来运行多项式套索回归。当使用family="multinomial和具有p变量、n样本和pmax=x的数据集时,如果x是奇数(如果不是pmax>p。在这种情况下,它很可能被忽略,因为它没有影响),则会出现分割故障。一个例子:

n=100
p=20
require(glmnet)
D= as.data.frame(replicate(p, rnorm(n)))
D[,p] = as.factor(round(rnorm(n)))
lasso  <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial")         ## works
lasso  <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=7) ## works, because it is odd
lasso  <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=24 ## works, because pmax>p
lasso  <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=10)## crashes

和错误消息:

*** caught segfault ***
address 0x22de58a8, cause 'memory not mapped'
Traceback:
1: .Fortran("lognet", parm = alpha, nobs, nvars, nc, as.double(x),     y, offset, jd, vp, cl, ne, nx, nlam, flmin, ulam, thresh,     isd, intr, maxit, kopt, lmu = integer(1), a0 = double(nlam *         nc), ca = double(nx * nlam * nc), ia = integer(nx), nin = integer(nlam),     nulldev = double(1), dev = double(nlam), alm = double(nlam),     nlp = integer(1), jerr = integer(1), PACKAGE = "glmnet")
2: lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,     nvars, jd, vp, cl, ne, nx, nlam, flmin, ulam, thresh, isd,     intr, vnames, maxit, kopt, family)
3: glmnet(data.matrix(D[, -p]), D[, p], standardize = T, family = "multinomial",     pmax = 10)

我的第一个问题是:为什么?这有数学上的原因吗?(我想是的…)

第二个问题是:没有比分割错误更好的解决方案吗?。。。像是警告?或者只使用pmax<-pmax-1

编辑:好的,看起来有点复杂。有时,只有当我第二次对pmax执行相同编号的相同命令时,才会出现分段错误。

此外,我发现这个错误

*** glibc detected *** /usr/lib64/R/bin/exec/R: double free or corruption (out): 0x0000000005c41720 ***
======= Backtrace: =========
....

对于偶数和奇数,pmax的数字。。。。

现在它对我来说更像是一只虫子……或者?

编辑2:我在linux环境(64位)中使用glmnet 1.9-5运行R 2.15.2我在另一台带有ubuntu 64位和R 3.0.2 的电脑上也遇到了分段故障

以下是我在R 3.0.2、64k、Windows 7、glmnet1.9-5 下得到的结果

lasso  <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=10)
Warning message:
from glmnet Fortran code (error code -10005); Number of nonzero coefficients along the path exceeds pmax=10 at 5th lambda value; solutions for larger lambdas returned 

你没有说明你的设置,所以我不能解释为什么你没有捕捉到错误,但这条消息应该能让你深入了解:-)为什么大的pmax会引起麻烦。

编辑:澄清一下:我没有一个segfault。

我知道这个答案太晚了,但以防万一有人会发现同样的问题:

我遇到了同样的问题,并按照这个问题中的步骤解决了它。基本上,对于任何版本的MATLAB,都可以尝试

mex -v -setup

当下降时,它会给出一个可供使用的编译器列表。安装最新的,但不是在MATLAB版本之后(对于2016a,我做了XE2016和VS2015)。然后

mex glmnetMex.F glmnet.f

将完成这项工作。

在一台Linux机器上(2014a),我尝试了

mex -largeArrayDims glmnetMex.F GLMnet.f

使用gcc编译器,它也工作了。

希望这能有所帮助。我花了好几个星期才弄明白。

最新更新