4

私は optim 関数にあまり詳しくないので、その結果からこれらの情報を取得したかったのです: a) 結果を達成するために何回の反復が必要でしたか? b) 一連の部分解、つまり各反復の最後に得られる解をプロットします。

今までの私のコードは次のようになります。

  f1 <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  x1^2 + 3*x2^2
}

res <- optim(c(1,1), f1, method="CG")

詳細情報を取得するにはどうすれば改善できますか?

前もって感謝します

4

3 に答える 3

6

関数に渡された値をグローバル リストに格納するように関数を変更できます。

i <- 0  
vals <- list()
f1 <- function(x) {
  i <<- i+1
  vals[[i]] <<- x

  x1 <- x[1]
  x2 <- x[2]
  x1^2 + 3*x2^2  
}

res <- optim(c(1,1), f1, method="CG")

関数を実行した後に i と vals を調べると、何が起こったかがわかります。optim の実行中に値を確認したい場合は、print ステートメントも関数にスローします。

于 2014-05-31T23:02:08.910 に答える
5

trace=1に制御パラメーターとして渡すoptimと、最適化の進行状況に関するより詳細な情報が得られます。

res <- optim(c(1,1), f1, method="CG", control=list(trace=1))
# Conjugate gradients function minimizer
# Method: Fletcher Reeves
# tolerance used in gradient test=3.63798e-12
# 0 1 4.000000
# parameters    1.00000    1.00000 
# * i> 1 4 0.480000
# parameters    0.60000   -0.20000 
#   i> 2 6 0.031667
# ......
# * i> 13 34 0.000000
# parameters   -0.00000    0.00000 
# 14 34 0.000000
# parameters   -0.00000    0.00000 
# Exiting from conjugate gradients minimizer
#   34 function evaluations used
#   15 gradient evaluations used

ただし、情報は標準出力にのみ書き込まれるように思われるためsink、出力をテキスト ファイルにパイプしてから、編集を行ってプロット用のパラメーター値を取得する必要があります。

于 2014-05-31T23:10:12.967 に答える
4

If all you wanted was the number of function evaluations, see the $counts element of the result:

 counts: A two-element integer vector giving the number of calls to
          ‘fn’ and ‘gr’ respectively. This excludes those calls needed
          to compute the Hessian, if requested, and any calls to ‘fn’
          to compute a finite-difference approximation to the gradient.

For the partial solutions you'll need @Dason's solution or something like it.

于 2014-05-31T23:22:18.387 に答える