4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rの最適化関数optimの目的関数(fr)にpar以外の引数を渡す

Last updated at Posted at 2015-11-06

Rには最適化関数がいくつかありますが、optimを使っている人も多いと思います。

optimの基本的な使い方他の記事を参照いただくとして、
(例えば)http://qiita.com/HirofumiYashima/items/c2e9ff4e3e9283ec1691

実際に使ってみると目的関数(fr)に最適化対象のパラメータ(par)以外の変数を渡す方法が分からず、手間取ったのでメモしておきます。

結論から書くと、optimの引数に渡したい変数を直接書けばよいです。

※実はoptimのマニュアルにも書いてありました。
... Further arguments to be passed to fn and gr.

マニュアルの例を参考に説明します。以下の最適化問題において、

fr <- function(x) {   ## Rosenbrock Banana function
    x1 <- x[1]
    x2 <- x[2]
    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

目的関数(fr)の変数はxだけですので、

> optim(c(-1.2,1), fr)
$par
[1] 1.000260 1.000506

$value
[1] 8.825241e-08

で実行できます。

しかし、実際に何かの分析に使うときは目的関数を次のように一般的にして、

fr <- function(x, a, b) {
    x1 <- x[1]
    x2 <- x[2]
    b * (x2 - x1 * x1)^2 + (a - x1)^2
}

データや要求に応じて適切なパラメータ(a,b)を与えて最適化したい場合もあります。

その場合、まず上記の目的関数fr(x,a,b)を定義して、optimの引数にparとなるx以外のa, bを明示的に渡します。(a, b)=(1, 100)とすると、

>optim(c(-1.2,1), fr, a=1, b=100)
$par
[1] 1.000260 1.000506

$value
[1] 8.825241e-08

となって、マニュアルの例と同じ結果になります。この例で用いられているRosenbrockのbanana functionの最適解は(解析的に)x1=a, x2=a^2になりますので、(a, b)=(10, 100)とすると、

> optim(c(-1.2,1), fr, a=10, b=100)
$par
[1]  9.999857 99.997107

$value
[1] 1.793687e-07

となります。他の最適化手法("BFGS"等)を選ぶ場合に、(必須ではありませんが)grも与えたい時はfrに合わせて定義式を書き換えます。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?