50
Rで色々やってみました 礒部 正幸 (@chiral) 第19回 #TokyoR

Tokyo.R #19 発表資料 「Rで色々やってみました」

Embed Size (px)

DESCRIPTION

2011/11/19 第19回東京R言語勉強会@大森発表資料

Citation preview

Page 1: Tokyo.R #19 発表資料 「Rで色々やってみました」

Rで色々やってみました

礒部 正幸 (@chiral)

第19回 #TokyoR

Page 2: Tokyo.R #19 発表資料 「Rで色々やってみました」

自己紹介

● ソフト開発エンジニア○ 学生時代: 記号的統計モデリング(prolog+統計)○ 現在: セキュリティ技術企業の研究開発部に所属

■ パケットキャプチャ製品、ログ解析製品にデータマイニングを応用し、企業組織内の色々な事象を自動認識する技術の開発に従事(+設計実装/マネジメントなど)

○ R暦: 2ヶ月(感想:R便利すぎワロタwww)

Page 3: Tokyo.R #19 発表資料 「Rで色々やってみました」

アジェンダ

1. 中心極限定理をシミュレーションで確かめてみた話2. PRMLの検証を始めたら第一章で謎に出会った話3. ガウスカーネルのσがよく分からないのでRで図を描いてみた話4. Rのアプリケーションとして動画のシーンカッターを作ってみた話5. 2011^(23!)をRのワンライナーで計算できて感動した話

Page 4: Tokyo.R #19 発表資料 「Rで色々やってみました」

(1)中心極限定理のシミュレーション

Page 5: Tokyo.R #19 発表資料 「Rで色々やってみました」

中心極限定理とは

● 統計学の本の最初のほうに大抵出てくる重要な定理

おおざっぱにいうと

「どんな分布でも、『その分布からN個サンプリングして平均をとった値』はN→∞で正規分布になる」

「どんな乱数でも、「N個平均」のラッパー越しに使うと正規乱数になってしまう」

という感じだと思います。

Page 6: Tokyo.R #19 発表資料 「Rで色々やってみました」

for(i in 1:100) r[i]<-mean(runif(100))hist(r) [0,1]の一様分布から100個サンプ

リングしてヒストグラム作成

Page 7: Tokyo.R #19 発表資料 「Rで色々やってみました」

r<-c()f<-function(n,m) { for(i in 1:m) r[i]<-mean(runif(n)); hist(r,main=paste('n =',n)); }layout(t(matrix(1:4,c(2,2))))for (n in c(10,100,1000,10000)) f(n,1000)

正規分布っぽいのが出た。

Page 8: Tokyo.R #19 発表資料 「Rで色々やってみました」

f1<-function(n,m) { for(i in 1:m) r[i]<-mean(runif(n)); hist(r,breaks=seq(0,1,length=100),main=paste('n =',n)); }for (n in c(10,100,1000,10000)) f1(n,1000)

横軸[0,1]にすると中心に寄っていく様子が見える。(大数の法則)

Page 9: Tokyo.R #19 発表資料 「Rで色々やってみました」

x<-seq(0,1,length=100)y<-pnorm(x,0.5, … ゚Д゚)ハッ!分散ってどうなるんだっけ?

それから、一様分布[0,1]の分散は1/12 http://goo.gl/wCdIY

正規分布を描いてみる

Page 10: Tokyo.R #19 発表資料 「Rで色々やってみました」

g<-function(n) { x<-seq(0,1,length=100); y<-dnorm(x,0.5,1/sqrt(12*n)); plot(x,y,type='n',main=paste('n =',n)); lines(x,y); }for (n in c(10,100,1000,10000)) g(n)

よさそう。

Page 11: Tokyo.R #19 発表資料 「Rで色々やってみました」

(2)回帰の検証(PRML第一章)

Page 12: Tokyo.R #19 発表資料 「Rで色々やってみました」

PRML第一章 図1.5y=(xのM次多項式) で係数を最小二乗法で求めたときの二乗誤差(をデータ数で割ったもの)のグラフ。(横軸がM,縦軸が二乗誤差)

Page 13: Tokyo.R #19 発表資料 「Rで色々やってみました」

Rで追試してみたソースコードはコチラ: https://gist.github.com/1272638

PRMLと形が違う。。

Page 14: Tokyo.R #19 発表資料 「Rで色々やってみました」

2回目

PRMLと形が違う。。

Page 15: Tokyo.R #19 発表資料 「Rで色々やってみました」

3回目

PRMLと形が違う。。

Page 16: Tokyo.R #19 発表資料 「Rで色々やってみました」

4回目

PRMLと形が違う。。

Page 17: Tokyo.R #19 発表資料 「Rで色々やってみました」

もしバグじゃないとしたら…

C.M.Bishop先生!同じ絵が描けません! ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄   ∧__∧∩  (´∀`)/ _ / /  /\ ⊂ノ ̄ ̄ ̄\ ||\     \ ||\|| ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄||

元のsin(x)に加えるノイズの標準偏差を変えても同様の結果になる。

Page 18: Tokyo.R #19 発表資料 「Rで色々やってみました」

考察:理由づけてみる

・M(多項式の次数)が小さいとき→ 多項式自体がロバスト→ 学習データに振り回されない→ 学習データの平均残差平方和も大きい→ テストデータの平均残差平方和は小さい(PRMLと違う)

・Mが大きいとき→ 学習データのノイズに引きずられて過学習→ 学習データにはジャストフィット→ テストデータからは大きくハズレる(PRMLと同じ)

Page 19: Tokyo.R #19 発表資料 「Rで色々やってみました」

(3)ガウシアンカーネルのσパラメータ

Page 20: Tokyo.R #19 発表資料 「Rで色々やってみました」

・カーネル法で一番良く使われそうなカーネル関数

・正規分布(ガウス分布)の形に似ている → 近い点どうしは値が大きく → 遠い点どうしは値が小さく

・σパラメータ → 正規分布の分散のようなもの

直感的な図を描いてみます。

Page 21: Tokyo.R #19 発表資料 「Rで色々やってみました」

Rで実装

ソースコード: https://gist.github.com/1289543

以下をσを色々変えてアニメーション・y=sin(x) + ガウスノイズ・SVM : library(kernlib) で2クラス分類・プロット

アニメーション(FLASH)

Page 22: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 23: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 24: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 25: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 26: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 27: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 28: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 29: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 30: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 31: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 32: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 33: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 34: Tokyo.R #19 発表資料 「Rで色々やってみました」
Page 35: Tokyo.R #19 発表資料 「Rで色々やってみました」

考察

・パラメトリックなカーネル関数は位相構造のテンプレート (パラメータは位相の粒度を調整する)

・ガウシアンカーネルの場合は、 密着位相(粗) ← 小さくなる ← σ → 大きくなる → 離散位相(細) (単純/フィットしにくい)                                  (複雑/過学習)

・本実験の「sin(x)+ノイズ」の場合、最適なσは0.5~1だった → 最適なσを決める基準は交差判定が一般的らしい → 「サポートベクトルの少なさ」も基準になりうると思われる

Page 36: Tokyo.R #19 発表資料 「Rで色々やってみました」

(4)動画シーンカッター ~Rのbcpパッケージを使って~

Page 37: Tokyo.R #19 発表資料 「Rで色々やってみました」

bcp(Bayesian Change Point)パッケージ

何か応用できないか? → 動画シーンカッター

Page 38: Tokyo.R #19 発表資料 「Rで色々やってみました」

動画シーンカッターを作る

檀れいさん出演 「金麦」 15秒CM 動画再生(youtube)

Page 39: Tokyo.R #19 発表資料 「Rで色々やってみました」

カラーヒストグラムとエントロピー

フレーム

カラーヒストグラム エントロピー

R G B

R G B

R G B

= 3.89

= 4.06

= 2.90

→ bcpに食わせる

Page 40: Tokyo.R #19 発表資料 「Rで色々やってみました」

実装

フレーム切り出し(0.25秒ごと)

カラーヒストグラム作成(フレーム毎)

エントロピー計算(フレーム毎)

Rのbcpパッケージで変化点検出

変化点のフレームを出力

YouTube動画(flvファイル)

Perl

ソースコード(Perl)

Page 41: Tokyo.R #19 発表資料 「Rで色々やってみました」

金麦CMで検証

いい感じ

エントロピー(Perl)

Page 42: Tokyo.R #19 発表資料 「Rで色々やってみました」

出力結果

bcpの事後確率 > 0.5

…まぁまぁですかね。

Page 43: Tokyo.R #19 発表資料 「Rで色々やってみました」

考察・感想

・カラーヒストグラムのエントロピーくらいで、画像の連続的変化をトラッキングできる

・高次元の位相を低次元にマップするような指標なら、同様の手法が使えそう

・bcpパッケージのドキュメントには、「等分散を仮定」と書いてあり、その辺りが「フレームを分類しきれてない原因」かと思われる

・「何らかの前処理」→(数値データ)→「R言語」というパターンで色々なアプリを作っていきたい

Page 44: Tokyo.R #19 発表資料 「Rで色々やってみました」

(5)高機能電卓としてのR ~2011^(23!) mod 10000 ~

Page 45: Tokyo.R #19 発表資料 「Rで色々やってみました」

数学問題botより出題

2)が解けなかったので、Rで解くことにした

Page 46: Tokyo.R #19 発表資料 「Rで色々やってみました」

コーディング・無名関数の呼出 → カッコでくくるだけ例)time<-(function(h,m,s)(h*60+m)*60+s)(14,30,5)・無名関数の再帰 → Recall()例) fact<-function(n) ifelse(n==1,1,n*Recall(n-1))・コマンドラインからワンライナー → R -q -e 'プログラム'例) c:\> R -q -e 'print(pi)'

Rプログラムをツイートできた。

Page 47: Tokyo.R #19 発表資料 「Rで色々やってみました」

考察

・Rは左辺値が変数宣言と見なされるのが電卓的に便利

・無名関数をラムダ式のように使えて便利

・無名関数の再帰が組み込みで便利

・コマンドラインからワンライナーも便利

→ Rでワンライナー、オススメかもです。

Page 48: Tokyo.R #19 発表資料 「Rで色々やってみました」

おまけ(1) https://gist.github.com/1272737

Page 49: Tokyo.R #19 発表資料 「Rで色々やってみました」

おまけ(2)

Page 50: Tokyo.R #19 発表資料 「Rで色々やってみました」

ご清聴ありがとうございました。

(違