我使用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
另外我发现了这个错误
*** 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上获得了分段错误答案 0 :(得分: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会导致麻烦。
编辑:澄清:我没有得到段错误。
答案 1 :(得分:0)
我知道这个答案为时已晚,但万一有人可能会发现同样的问题:
我遇到了同样的问题,并按照This Question中的步骤解决了问题。 基本上,对于任何版本的MATLAB,请尝试
mex -v -setup
当下降时,会给出一个要使用的编译器列表。安装更新的,但不是在MATLAB版本之后(对于2016a,我做了XE2016和VS2015)。然后
mex glmnetMex.F glmnet.f
将完成这项工作。
在Linux机器上(使用2014a),我试过
mex -largeArrayDims glmnetMex.F GLMnet.f
使用 gcc 编译器,它也有效。
希望这可能会有所帮助。我花了好几个星期来搞清楚这一点。