我有一段代码正在使用nnet包,我有兴趣计算一些不同的神经网络模型&然后将所有模型保存到磁盘(使用save())。
我遇到的问题是"术语"神经网络中的元素具有属性" .Environment"最终达到数百兆字节,而模型的其余部分只有几千字节。 (一旦删除拟合值和残差)
此外,删除" .Environment"在使用“预测”模型时,属性似乎不会导致问题。
有没有人知道R或nnet使用此属性做了什么?有没有人见过这样的东西?
答案 0 :(得分:1)
tl; dr:这是好的,除了一些非常特殊的情况
R中的.Environment
属性包含对R closure (通常为公式或的上下文的引用函数)已定义。 R环境是一个包含变量值的商店,类似于列表。这允许公式引用这些变量,例如:
> f = function(g) return(y ~ g(x))
> form = f(exp)
> lm(form, list(y=1:10, x=log(1:10)))
...
Coefficients:
(Intercept) g(x)
3.37e-15 1.00e+00
在此示例中,公式form
(如果定义为y~exp(x)
,则为g
提供exp
的值。为了能够找到g
的值(函数f
的参数),公式需要保持对函数f
调用内构造的环境的引用
您可以使用attributes()
或environment()
函数查看附加到公式的环境,如下所示:
> attributes(form)
$class
[1] "formula"
$.Environment
<environment: R_GlobalEnv>
> environment(form)
<environment: R_GlobalEnv>
我相信你正在使用nnet()
函数变量和公式(而不是矩阵),即
> nnet(y ~ x1 + x2, ...)
不幸的是,即使您的公式没有引用任何公式,R也会保留整个环境(包括定义公式所定义的所有变量)。语言无法轻易告诉您在环境中使用或不使用的内容。
One solution是明确保留环境所需的部分。特别是,如果您的公式没有引用环境中的任何内容(这是最常见的情况),则可以安全地删除它。
我建议您在致电nnet
之前从公式中删除环境,如下所示:
form = y~x + z
environment(form) = NULL
...
result = nnet(form, ...)