python, R, vimでデータマイニング

python, R, vim で疑問に思ったことなどを

そろそろ最適化問題を勉強したい:optim

最適化問題をおろそかにしてきた

実務ではパラメータ推計やモデル構築で事足りて最適化問題をおろそかにしてきた。

最適化が必要な状況

順序予測を回帰でモデル構築した後に予測値を離散化して順序にしたい。
離散化のカットオフ値を決めるときに最適化が使えるらしい。
モデルの予測値が得られた後に現実に合わせるのに最適化は使えそう。

難しいことは置いといて簡単な考え方

難しいことはわからないので簡単イメージ。 高校で勉強した極値問題と考えると自分のなかではイメージしやすい。

簡単な問題:2次関数

簡単な問題。

x^2+3x+1
3x3

極値を求める。

# 関数定義
f <- function(x) {
  x ^ 2 + 3 * x + 1
  }
f(3)
## [1] 19
library(ggplot2)
p <- ggplot(data=data.frame(X=c(-3,3)), aes(x=X))
p <- p + stat_function(fun=f)
p

# 最小化 グラフを見ると下に凸でx=-1.5ぐらいでy=-1.5ぐらいが最小値。
実際にoptim関数で計算する。

optim(par = -2, fn = f, method = "L-BFGS-B", lower = -3, upper = 3)
## $par
## [1] -1.5
## 
## $value
## [1] -1.25
## 
## $counts
## function gradient 
##        4        4 
## 
## $convergence
## [1] 0
## 
## $message
## [1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"

結果はx=-1.5, y=-1.25。

最大化

グラフを見ると下に凸でx=3でy=19が最小値。
実際にoptim関数で計算する。
最大化する場合は control=list(fnscale=-1) を指定する。

optim(par = -2, fn = f, method = "L-BFGS-B", lower = -3, upper = 3, control=list(fnscale=-1))
## $par
## [1] -3
## 
## $value
## [1] 1
## 
## $counts
## function gradient 
##        3        3 
## 
## $convergence
## [1] 0
## 
## $message
## [1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"

結果はx=-3, y=1。結果が間違い。
これは初期値 par = -2 を指定したことが原因。
極値複数ある場合は局所最適に陥り全体最適にならない場合がある。
このような場合は初期値を複数試してみて全体最適を探る必要がある。
初期値 x = 0 で試してみる。

optim(par = 0, fn = f, method = "L-BFGS-B", lower = -3, upper = 3, control=list(fnscale=-1))
## $par
## [1] 3
## 
## $value
## [1] 19
## 
## $counts
## function gradient 
##        2        2 
## 
## $convergence
## [1] 0
## 
## $message
## [1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"

疑問:離散の最適化

ふと、離散の最適化について疑問に思った。
調べてみるとやはり難しい問題のようで、おいおい必要に応じて勉強したい。

今、私が求めている最適化問題

  1. 目的変数が順序尺度
  2. 回帰でモデルを構築
  3. モデルで計算した予測値を順序尺度にしたい
  4. 最も適したカットオフ値を求めたい
  5. モデルの評価指標は重み付きkappa

続きはまた後で。今回はここまで