我有一段使用 nnet 包的代码,我有兴趣计算许多不同的神经网络模型,然后将所有模型保存到磁盘(使用 save() )。
我遇到的问题是神经网络中的“术语”元素有一个属性“.Environment”,最终达到数百兆字节,而模型的其余部分只有几千字节。(一旦拟合值和残差被删除)
此外,删除“.Environment”属性似乎不会在使用带有“预测”的模型方面造成问题。
有谁知道 R 或 nnet 对这个属性做了什么?有没有人见过这样的事情?
我有一段使用 nnet 包的代码,我有兴趣计算许多不同的神经网络模型,然后将所有模型保存到磁盘(使用 save() )。
我遇到的问题是神经网络中的“术语”元素有一个属性“.Environment”,最终达到数百兆字节,而模型的其余部分只有几千字节。(一旦拟合值和残差被删除)
此外,删除“.Environment”属性似乎不会在使用带有“预测”的模型方面造成问题。
有谁知道 R 或 nnet 对这个属性做了什么?有没有人见过这样的事情?
tl; dr:这没关系,除了一些非常特殊的情况
R 中的.Environment
属性包含对定义 R闭包(通常是公式或函数)的上下文的引用。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()
您可以使用or函数查看附加到公式的环境environment()
,如下所示:
> attributes(form)
$class
[1] "formula"
$.Environment
<environment: R_GlobalEnv>
> environment(form)
<environment: R_GlobalEnv>
我相信您正在使用nnet()
带有公式(而不是矩阵)的函数变体,即
> nnet(y ~ x1 + x2, ...)
不幸的是,即使您的公式没有引用任何环境,R 也会分配整个环境(包括定义公式的所有变量)。该语言无法轻松地从环境中分辨出您可能使用或不使用的内容。
一种解决方案是仅显式保留环境的所需部分。特别是,如果您的公式没有引用环境中的任何内容(这是最常见的情况),则可以安全地删除它。
我建议在调用之前从公式中删除环境nnet
,如下所示:
form = y~x + z
environment(form) = NULL
...
result = nnet(form, ...)