2

我有一段使用 nnet 包的代码,我有兴趣计算许多不同的神经网络模型,然后将所有模型保存到磁盘(使用 save() )。

我遇到的问题是神经网络中的“术语”元素有一个属性“.Environment”,最终达到数百兆字节,而模型的其余部分只有几千字节。(一旦拟合值和残差被删除)

此外,删除“.Environment”属性似乎不会在使用带有“预测”的模型方面造成问题。

有谁知道 R 或 nnet 对这个属性做了什么?有没有人见过这样的事情?

4

1 回答 1

1

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, ...)
于 2016-03-29T10:53:50.033 回答