【问题标题】:R glmnet: segmentation fault when using multinomial and pmaxR glmnet:使用多项式和 pmax 时出现分段错误
【发布时间】:2014-01-29 10:00:19
【问题描述】:

我使用glmnet 包运行多项套索回归。当使用family="multinomial 和具有p 变量和nsamples 和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&lt;-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 的另一台 PC 上遇到分段错误

【问题讨论】:

  • 我很惊讶最新版本的 glmnet 甚至可以在 2.x 版本的 R 中运行。你如何升级以获得正确的代码?

标签: r segmentation-fault glmnet multinomial


【解决方案1】:

这是我得到的,在 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 会导致问题。

编辑:澄清一下:我没有遇到段错误。

【讨论】:

  • sry,我在第一篇文章中添加了系统信息。不,这个警告是完全正常的。这就是使用 pmax 的原因:不是所有的 lamda 值都被使用,而是直到一定数量的变量具有非零系数。每当没有引发分段错误时,我的设置中也会出现此警告
【解决方案2】:

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

我遇到了同样的问题,按照This Question中的步骤解决了。 基本上,对于您拥有的任何版本的 MATLAB,请尝试

mex -v -setup

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

mex glmnetMex.F glmnet.f

将完成这项工作。

在 Linux 机器上(使用 2014a),我试过了

mex -largeArrayDims glmnetMex.F GLMnet.f

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

希望这可能会有所帮助。我花了好几个星期才弄清楚这一点。

【讨论】:

  • 这是一个R 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2015-01-12
  • 1970-01-01
  • 2017-06-06
  • 2017-08-26
相关资源
最近更新 更多