2017-05-05 3 views
4

私はいくつかのニューラルネットワークの出力をプロットしようとしていますが、結果は得られません。 plot(iris)のような通常のものをプロットするとうまくいきますが、同じ方法でプロットしていないようなneuralnetwork()オブジェクトに関するものがあります。knitrとプロットするニューラルネットワーク

私のファイルは、以下のようになります。

--- 
title: "stack" 
author: "stack" 
date: "today" 
output: 
    pdf_document: default 
    html_document: default 
--- 


```{r} 
library(neuralnet) 
AND <- c(rep(0,3),1) 
binary.data <- data.frame(expand.grid(c(0,1), c(0,1)), AND) 
net <- neuralnet(AND~Var1+Var2, binary.data, hidden=0,err.fct="ce", linear.output=FALSE) 
plot(net) 
``` 

そして、私は何も出力を取得していません。同じファイルは他のものをうまくプロットしています。何かご意見は?

+0

'neuralnet :: plot(net)'を試して、何が起こるかを見てください。私は 'rbokeh'と' DT'で作業していて、チャンク内でも同様の問題を抱えていますが、別のウィンドウのスクリプトでは全く問題はありません。何とか基本機能が途中にあるように感じます。あなたに起こっていることではないかもしれませんが、それは私のために働き、試してみる価値があります。 – sconfluentus

+0

最初は「neuralnet :: plot」という問題はないと思っていましたが、編み物とは対照的にチャンクを実行するとプロットが生成されることがわかりました。確かに奇妙です。 – neilfws

+1

これは前に報告されています:https://github.com/rstudio/rmarkdown/issues/856 –

答えて

7

この問題has been reportedは、先にrmarkdownリポジトリに回答しました。ここで私はそれがうまくいかなかった技術的理由を説明しようとしています。私は上記の....を使用してirrelvant情報を省略している

> neuralnet:::plot.nn 
function (x, rep = NULL, x.entry = NULL, x.out = NULL, radius = 0.15, 
    .... 
{ 
    .... 
    if (is.null(rep)) { 
     for (i in 1:length(net$weights)) { 
      .... 
      grDevices::dev.new() 
      plot.nn(net, rep = i, 
        .... 
     } 
    } 

:ソースコード(v1.33)から

Usage 

    ## S3 method for class 'nn' 
    plot(x, rep = NULL, x.entry = NULL, x.out = NULL, 
     .... 


Arguments 

    ... 

    rep repetition of the neural network. If rep="best", the repetition 
     with the smallest error will be plotted. If not stated all repetitions 
     will be plotted, each in a separate window. 

:ヘルプページ?neuralnet::plot.nnから

。基本的にrepを指定しない場合、neuralnet:::plot.nn新しいグラフィックデバイスを描画します。これは、グラフィカルなデバイスを開いたが、(dev.control(displaylist = 'enable')経由で)記録をオンにするためにそれらを要求しなかった

  1. ので、それは、knitrのグラフィック記録を中断します。
  2. knitrはデフォルトでグラフィックスを記録するために独自のデバイスを使用します。ユーザーが新しいデバイスを開いた場合、knitrで新しいプロットを保存できるという保証はありません。一般に、私は、プロット関数でグラフィカルデバイスを操作することをお勧めしません。例えば、私はneuralnetパッケージの作者ないんだけど、私は著者がdev.new()をドロップ示唆、あるいは少なくともそれを条件付きにしたい

if (interactive()) grDevices::dev.new() 

私はdev.new()コールの意図が新しいウィンドウでプロットを表示するには、おそらくだったが、ユーザーがウィンドウを見ることができる保証は本当にありませんね。 対話型の Rセッションのデフォルトのグラフィカルデバイスは、ウィンドウ/スクリーンデバイス(利用可能であればx11()またはquartz()など)ですが、デフォルトデバイスがユーザーまたはパッケージ作成者によって変更されている可能性があります。

非対話型のRセッションのために、それはおそらく(オフスクリーン、デフォルトで)を新たに開くためにあまり意味がありませんので、私は条件interactive()を提案するデバイス。

1

私は問題は、クラスnnのオブジェクトの場合、plotはパラメータrepを使用していると思います。 repが定義されていない場合は、すべての繰り返しが別のウィンドウにプロットされます(RMarkdownの外部で実行される場合)。 rep = "best"の場合は、誤差が最も小さいプロットのみが生成されます。これはうまくいくはずです:

```{r} 
library(neuralnet) 
AND <- c(rep(0,3),1) 
binary.data <- data.frame(expand.grid(c(0,1), c(0,1)), AND) 
net <- neuralnet(AND~Var1+Var2, binary.data, hidden=0,err.fct="ce", 
linear.output=FALSE) 
plot(net, rep = "best") 
``` 

?plot.nnを参照してください。

関連する問題