2

nnet パッケージを使用しているコードがあり、さまざまなニューラル ネットワーク モデルを計算し、すべてのモデルをディスクに保存することに関心があります ( save() を使用)。

私が直面している問題は、ニューラル ネットワークの "terms" 要素に属性 ".Environment" があり、最終的に数百メガバイトになるのに対し、モデルの残りの部分は数キロバイトしかないことです。(適合値と残差が削除されると)

さらに、「.Environment」属性を削除しても、「予測」でモデルを使用するという点で問題は発生しないようです。

Rまたはnnetがこの属性で何をしているのか、誰にもわかりませんか? 誰もこのようなものを見たことがありますか?

4

1 に答える 1

1

tl;dr: いくつかの非常に特殊なケースを除いて、これで問題ありません

バックグラウンド

Rの.Environment属性には、Rクロージャ(通常はformulaまたはfunction ) が定義されたコンテキストへの参照が含まれています。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)与えます。( function への引数である)の値を見つけることができるようにするために、式は function への呼び出し内で構築された環境への参照を保持する必要があります。gexpgff

attributes()次のようにまたはenvironment()関数を使用して、式に関連付けられた環境を表示できます。

> attributes(form)
$class
[1] "formula"

$.Environment
<environment: R_GlobalEnv>

> environment(form)
<environment: R_GlobalEnv>

あなたの質問

nnet()関数バリアントを(行列ではなく)式で使用していると思います。

> nnet(y ~ x1 + x2, ...)

残念ながら、R は環境全体 (式が定義されている場所で定義されているすべての変数を含む) を割り当てたままにします。式がそれを参照していなくてもです。環境から何を使用していて、何を使用していないかを言語が簡単に判断する方法はありません。

1 つの解決策は、環境の必要な部分のみを明示的に保持することです。特に、数式が環境内の何も参照していない場合 (これが最も一般的なケースです)、削除しても安全です。

nnet次のように、を呼び出す前に式から環境を削除することをお勧めします。

    form = y~x + z
    environment(form) = NULL
    ...
    result = nnet(form, ...)
于 2016-03-29T10:53:50.033 に答える