optimization in r

Post on 25-May-2015

3.538 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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

top related