tokyo r 10_12

47
最適化 アレ  ソレ  コレ @kenchan0130_aki 前編

Upload: tadayuki-onishi

Post on 24-May-2015

2.599 views

Category:

Technology


5 download

TRANSCRIPT

最適化アレ  ソレ  コレ

@kenchan0130_aki

前編

アレ ソレ コレ

いま、Rをインストールしていると誰でも

最適化問題が

月額料金0円~

RNUOPTだと420000円も!!

自己紹介•学部4年生 → 院進学

•専攻は確率過程、信用リスク

• Java、PHP、R(、Python)

•インターンでwebサイトを立ち上げ中

最適化とは

•関数・プログラム・製造物などを最適な状態に近づけること

最適化問題=

今回の場合、ある制約条件のもとで関数を最大または最小にする解を探すこと

引用:wikipedia

さっそくRに用意されている関数を使って最適化をしてみよう!

関数の最適化を考える

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

optimize(optimise)関数

•一変数関数の最大、最小値を求めることができる

• maximum=TRUE で最大化(デフォルトはFALSE)

•黄金分割探索と逐次放物線補間の組み合わせ

早速使ってみる

-40 -20 0 20 40

80100120140160

x

fw (x

)

-40 -20 0 20 40

80100120140160

x

fw (x

)

-40 -20 0 20 40

80100120140160

x

fw (x

)

ん?最適化できたのか?

範囲を狭めてもう一度やってみる

-40 -20 0 20 40

80100120140160

x

fw (x

)

どうも初期値に依存するのではないか

-40 -20 0 20 40

80100120140160

x

fw (x

)

どうも初期値に依存するのではないか

どうも怪しい

-40 -20 0 20 40

80100120140160

x

fw (x

)

どうも初期値に依存するのではないか

-40 -20 0 20 40

80100120140160

x

fw (x

)

-40 -20 0 20 40

80100120140160

x

fw (x

)

-40 -20 0 20 40

80100120140160

x

fw (x

)

こうなるべきなんじゃないの?

•多変数関数の最大、最小値を求めることができる

• control=list( fnscale=(負の値) ) で最大化

• Nelder-Mead、BFGS、CG、L-BFGS-B、SANN法が使える

•一変数に対しても使えなくはないが、既定の手法はうまく動作しない

optim関数BFGS法は準ニュートン法CG法は共役勾配法(メモリー使用量が少ないため、大規模最適化に使える可能性がある)L-BFGS-B法は制約条件を許す準ニュートン法SANN法はシュミレーテッド・アニーリング法(あまり一般的ではない)

さっきのoptimizeの初期値を推定できるのでは?

多変数の最適化ができるなら

つまり

二変数の最適化であると考えればいいのでは?

ということで、やってみた

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

キタコレ

ちなみに、optim関数で推定した値は

• Nelder-mead、SANN法は、微分できない関数にも使用でき、初期値にそこまで敏感ではない

•上記の手法で得られた値を使用して、BFGS、CG法を使ってみるのも有

optim関数

SANN法を使って一変数の最適化をやってみる

得られた値を使用してBFGS法を試してみる

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

•原則として局所的最適値しか見つけられない

•計算における数値誤差もあったりする

•変数の数が多くなればなるほど、推定は難しくなる

optim関数本当に最

適解が求まったの

か?

•ニュートン法タイプのアルゴリズムを用いて関数を最小化

•最大化したい場合は 関数の戻り値 ×(−1)

• r-help記事によるとoptim関数より、しばしば良い結果を与えるらしい

nlm関数

いい結果がでるならやるしかない

$codeが1,2なら成功3,4,5,6なら失敗

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

どうもnlm関数は初期値周りの最小値を探しているみたい

• PORTルーチンを用いた最小化関数

•最大化したい場合は 関数の戻り値 ×(−1)

•謎に包まれ(てしまっ)た最適化関数

nlminb関数

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

-40 -20 0 20 40

80100

120

140

160

x

fw (x

)

ほぼ初期値の値が返ってきてしまう

まとめ

•非線形関数の最適化を行ってきた

•用途に応じて最適化関数は使い分ける必要有

•初期値選びで最適化が左右される

•関数が動いたからと言ってそれが最適解とは限らない

参考文献

• RjpWiki - 関数の最大・最小化

• http://www.okada.jp.org/RWiki/?%B4%D8%BF%F4%A4%CE%BA%C7%C2%E7%A1%A6%BA%C7%BE%AE%B2%BD

• R基本統計関数マニュアル

• http://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf

• Stefano M. Iacus (2011) - Option Pricing and Estimation of Financial Models with R