Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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に合わせて定義式を書き換えます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした