R glmnet: 使用multinomial和pmax时出现分段错误

3

我使用glmnet包来运行多项式Lasso回归。 当使用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中的奇数和偶数数字,两者都适用...

现在看起来更像是一个bug了...或者?

编辑2: 我在64位linux环境下使用R 2.15.2和glmnet 1.9-5运行。 另外,在ubuntu 64位和R 3.0.2上的另一台PC上也出现了分段错误。


我很惊讶glmnet的最新版本甚至能在R 2.x版本上运行。你为什么不升级以获得正确的代码呢? - Carl Witthoft
2个回答

0

以下是我在 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 会引起问题。
编辑:澄清一下:我没有得到段错误。

抱歉,我在第一篇帖子中添加了系统信息。不,这个警告是完全正常的。这就是使用pmax的原因:并非所有的lamda值都被使用,而只有在某些变量具有非零系数时才会使用。在我的设置中,只要没有抛出分段错误,这个警告也会出现。 - Jonas

-1

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

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

mex -v -setup

当它掉下来时,会给出要使用的编译器列表。安装较新的版本,但不要超过MATLAB版本(对于2016a,我使用了XE2016和VS2015)。然后

mex glmnetMex.F glmnet.f

会完成这项工作。

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

mex -largeArrayDims glmnetMex.F GLMnet.f

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

希望这可以有所帮助。我花了几周时间才解决这个问题。


这是一个关于 R 的问题。 - jan-glx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接