optimization in r
TRANSCRIPT
Optimization in Rid:syou6162
Saturday, March 27, 2010
Agenda
• 自己紹介• 自分とGSoCとTsukuba.R
• Optimization in R(Rにおける最適化)
• パラメータ推定の話• 途中で関数型言語としてのRの紹介• 内部で使われている手法の紹介
Saturday, March 27, 2010
自己紹介
• 吉田康久(id:syou6162、@syou6162)
• http://syou6162.sakura.ne.jp/
• つくば => 奈良
• 自然言語処理&機械学習
Saturday, March 27, 2010
Google Summer of Code
• 3/29より応募開始
• NoSQL interface for R
• Dirk Eddelbuettelさん
• 大学生、大学院生の人
Saturday, March 27, 2010
Tsukuba.R
• (たぶん)日本で最初のRのローカルなユーザーコミュニティ
• 昨年のRユーザー会で発表
• 最近、各地(Tokyo、Osaka、Nagoya)でコミュニティができてるのでうれしい
• 2008年7月に開始、#6までやりました
Saturday, March 27, 2010
やっている内容(1)• 初心者編
• データ構造、基本的な関数、plot関係
• 統計処理の基本
• Rにおけるぐぐり方
• 中級者編
• 総称関数、apply family
• ggplot2、animation
Saturday, March 27, 2010
やっている内容(2)
• 上級者編
• RのC拡張、高速化
• openCVをC拡張でRから触る
• Rのソースコードの読み方
• 番外編
• Twitterのデータを実習形式で分析
Saturday, March 27, 2010
写真で見てみるTsukuba.R
Saturday, March 27, 2010
Saturday, March 27, 2010
Saturday, March 27, 2010
Saturday, March 27, 2010
Saturday, March 27, 2010
Saturday, March 27, 2010
宣伝乙
• 僕のことはどうでもいいので、Tsukuba.Rのことだけ覚えて帰ってください
• ちなみに次回は東京開催
Saturday, March 27, 2010
Optimization in Rid:syou6162
Saturday, March 27, 2010
Rにおける最適化関数
• 今日扱いたい関数は2つだけ!!
• optim、optimize
• optimは多変数、optimizeは1変数の最適化関数
• 使ったことある人?
Saturday, March 27, 2010
なんで最適化?
• Rは統計処理を得意とする言語
• 集計、検定、分散分析 => それだけじゃない!!
• パラメータ推定も重要なところ
• パラメータ推定って何?
Saturday, March 27, 2010
例:線形回帰モデル
http://ja.wikipedia.org/wiki/線形回帰
ちょうどいい(=最適な)
切片と傾きを求めたい!!
Saturday, March 27, 2010
モデルと現実• 線形回帰モデルは簡単なモデルなので、最適なパラメータ(傾き)を閉じた形で書ける
• 現実の問題に適用しようとすると、線形回帰では力不足なことが多い• 閉じた形でパラメータを計算することができない
• そこで最適化が必要になる!!
Saturday, March 27, 2010
単純な例
> f <- function (x) (x - 1 / 3)^2> (xmin <- optimize(f, c(0, 1), tol = 0.0001)$minimum[1] 0.3333333
$objective[1] 0
目的関数
求めたい解の上限と下限
最適解
最適値
Saturday, March 27, 2010
統計での例• 正規分布のパラメータ推定• 正規分布• データが独立に同一の正規分布から生成されたとすると、その確率(尤度)は
• 普通は対数尤度関数で考える
Saturday, March 27, 2010
Rで対数尤度関数• 対数尤度関数の式
• Rでの関数で書くとlog_likelihood_for_norm <- function(x){ return(function(par){ mu <- par[1] sigma2 <- par[2] - length(x) / 2 * log(sigma2) - 1 / 2 * sum((x - mu)^2) / sigma2 })} データ(x)を与えると、μ、σをパラメー
タとする関数を返す関数になっている
Saturday, March 27, 2010
余談 : 関数型• Rは関数型言語• 関数を引数に取ったり、関数を戻り値として返したり• 関数を値として扱える
• Rでは無名関数でよく使う : apply family
• apply、sapply、mapply、 lapply、 tapply、rapply、eapply
Saturday, March 27, 2010
例 : sapply&rapply
> invisible(sapply(1:3, function(x) { cat("x is", x, fill=TRUE) }))x is 1x is 2x is 3
> rapply(list(list(c("a", "b"), list(1:10)), matrix(1:10, 2, 5)),+ function(x) {+ class(x)+ }+ )[1] "character" "integer" "matrix"
Saturday, March 27, 2010
Rで対数尤度関数• 対数尤度関数の式
• Rでの関数で書くとlog_likelihood_for_norm <- function(x){ return(function(par){ mu <- par[1] sigma2 <- par[2] - length(x) / 2 * log(sigma2) - 1 / 2 * sum((x - mu)^2) / sigma2 })} データ(x)を与えると、μ、σをパラメー
タとする関数を返す関数になっている
Saturday, March 27, 2010
あとはoptimに投げるだけ• 実際にパラメータ推定するためのデータ => cars$speed
> optim(par = c(5, 10), fn = log_likelihood_for_norm(cars$speed), control = list(fnscale = -1))$par[1] 15.39812 27.40184
$value[1] -107.7636
$countsfunction gradient 75 NA
$convergence[1] 0
$messageNULL
初期値 目的関数(対数尤度関数)
最適解
最適値
optimはディフォルトで最小化になっているので、fnscale=-1で最大化するように指
定することに注意
Saturday, March 27, 2010
最適解?
> mean(cars$speed)[1] 15.4> var(cars$speed)[1] 27.95918
> optim(par = c(5, 10), fn = log_likelihood_for_norm(cars$speed), control = list(fnscale = -1))$par[1] 15.39812 27.40184
$value[1] -107.7636
$countsfunction gradient 75 NA
$convergence[1] 0
$messageNULL
ほぼ一致しているようだ!!
Saturday, March 27, 2010
最小二乗法の例
result <- lm(dist~speed, data=cars)plot(cars)coef <- result$coefabline(coef[1], coef[2], col="red")
これを自分でやる!!
Saturday, March 27, 2010
> obj_func <- function(x, y) {+ function(par) {+ a <- par[1]; b <- par[2]+ sum((y - (a + b * x))^2)+ }+ }> > result <- optim(par = c(0, 5), fn = obj_func(cars$speed, cars$dist))> result$par[1] -17.579625 3.932217> lm(dist~speed, data=cars)$coef(Intercept) speed -17.579095 3.932409 ほぼ一致しているようだ!!
Saturday, March 27, 2010
時間があれば...
• optim関数の引数methodについて• CG、 BFGS、Nelder-Mead、L-BFGS-
B、SANN
• どれも非制約連続変数の最適化問題を解くための手法
Saturday, March 27, 2010
CG(共役勾配)法• もともとは連立一次方程式を解くための手法
• 2次関数の最小化
• 大規模でも動く• 目的関数がn次の2次関数なら、高々n回で収束することが保証される
• 右図の緑は最急降下法。赤はCG法
• 共役方向にうまく進んでいる
http://ja.wikipedia.org/wiki/共役勾配法Saturday, March 27, 2010
BFGS法• 準ニュートン法 <= ニュートン法を改良
• ニュートン法 => 目的関数を2次関数に近似 => 局所二次収束性というよい性質を持っている
• 最適解の十分近くでは、結構早く最適解に収束
• 欠点 => 目的関数が2次に近似できないような関数だとうまく関数値が下がって(降下方向)くれないことが多い
• うまいこと関数値が下がってくれるように近似したものを考えてあげるのが準ニュートン法
• 超一次収束というそれなりの速度で収束
Saturday, March 27, 2010
Nelder-Mead法• N次元の関数の最小化をするときに、N+1個の点を選んであげる
• 移動後の点が最良点より良ければ、移動幅を大きく
• 谷状になっていることが検出されれば、移動幅を小さく
• 最適値に近づいているようならば、単体の体積を縮小
• 関数の導関数が分からなくても適用できる利点があるが、関数の評価回数は多く、計算時間がかかる
http://ibisforest.org/index.php?Nelder-Mead法Saturday, March 27, 2010
Nelder-Mead法の例
optimの(methodの)ディフォルト引数
Saturday, March 27, 2010
Rにおける最適化戦略• optimは簡単に実行できるけど、いい解が簡単に見つかるとは思わないほうがいい• 初期値問題、収束スピードの遅さetc
• 最初はNelder-Mead法、SANN法などの初期値によらない手法を使って初期値の候補を決める
• それを使って、BFGS法、CG法などの切れ味鋭い手法を使う
Saturday, March 27, 2010
FAQ
Saturday, March 27, 2010
Rの最適化って早いの?
• あんまり早くないかもしれない
• でも、高速化できる手段が確保されている
• C、C++による拡張
• Tsukuba.R#4で発表したので、そちらを参考に
• http://d.hatena.ne.jp/syou6162/20090301/1235890688
Saturday, March 27, 2010
勾配与えてなくね?
• CG法、BFGS法• 関数の微分(勾配)が必要、と言った
• optim関数は勾配が与えられないと数値微分をしてくれる• ただ、勾配が分かっているんだったら与えてあげたほうがより正確な解を得ることができる
Saturday, March 27, 2010
他言語でも最適化関数使いたい
• 使えます• Writing R Extentionsを読め!!
Saturday, March 27, 2010
まとめ• 自己紹介• 自分とGSoCとTsukuba.R
• Optimization in R(Rにおける最適化)
• パラメータ推定の話• 途中で関数型言語としてのRの紹介• 内部で使われている手法の紹介
Saturday, March 27, 2010