Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@kotokon-pp

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

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

4
Help us understand the problem. What is going on with this article?
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.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?