Upload
masayuki-isobe
View
3.425
Download
7
Embed Size (px)
DESCRIPTION
2011/11/19 第19回東京R言語勉強会@大森発表資料
Citation preview
Rで色々やってみました
礒部 正幸 (@chiral)
第19回 #TokyoR
自己紹介
● ソフト開発エンジニア○ 学生時代: 記号的統計モデリング(prolog+統計)○ 現在: セキュリティ技術企業の研究開発部に所属
■ パケットキャプチャ製品、ログ解析製品にデータマイニングを応用し、企業組織内の色々な事象を自動認識する技術の開発に従事(+設計実装/マネジメントなど)
○ R暦: 2ヶ月(感想:R便利すぎワロタwww)
アジェンダ
1. 中心極限定理をシミュレーションで確かめてみた話2. PRMLの検証を始めたら第一章で謎に出会った話3. ガウスカーネルのσがよく分からないのでRで図を描いてみた話4. Rのアプリケーションとして動画のシーンカッターを作ってみた話5. 2011^(23!)をRのワンライナーで計算できて感動した話
(1)中心極限定理のシミュレーション
中心極限定理とは
● 統計学の本の最初のほうに大抵出てくる重要な定理
おおざっぱにいうと
「どんな分布でも、『その分布からN個サンプリングして平均をとった値』はN→∞で正規分布になる」
や
「どんな乱数でも、「N個平均」のラッパー越しに使うと正規乱数になってしまう」
という感じだと思います。
for(i in 1:100) r[i]<-mean(runif(100))hist(r) [0,1]の一様分布から100個サンプ
リングしてヒストグラム作成
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)
正規分布っぽいのが出た。
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]にすると中心に寄っていく様子が見える。(大数の法則)
x<-seq(0,1,length=100)y<-pnorm(x,0.5, … ゚Д゚)ハッ!分散ってどうなるんだっけ?
それから、一様分布[0,1]の分散は1/12 http://goo.gl/wCdIY
正規分布を描いてみる
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)
よさそう。
(2)回帰の検証(PRML第一章)
PRML第一章 図1.5y=(xのM次多項式) で係数を最小二乗法で求めたときの二乗誤差(をデータ数で割ったもの)のグラフ。(横軸がM,縦軸が二乗誤差)
2回目
PRMLと形が違う。。
3回目
PRMLと形が違う。。
4回目
PRMLと形が違う。。
もしバグじゃないとしたら…
C.M.Bishop先生!同じ絵が描けません! ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ∧__∧∩ (´∀`)/ _ / / /\ ⊂ノ ̄ ̄ ̄\ ||\ \ ||\|| ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄||
元のsin(x)に加えるノイズの標準偏差を変えても同様の結果になる。
考察:理由づけてみる
・M(多項式の次数)が小さいとき→ 多項式自体がロバスト→ 学習データに振り回されない→ 学習データの平均残差平方和も大きい→ テストデータの平均残差平方和は小さい(PRMLと違う)
・Mが大きいとき→ 学習データのノイズに引きずられて過学習→ 学習データにはジャストフィット→ テストデータからは大きくハズレる(PRMLと同じ)
(3)ガウシアンカーネルのσパラメータ
・カーネル法で一番良く使われそうなカーネル関数
・正規分布(ガウス分布)の形に似ている → 近い点どうしは値が大きく → 遠い点どうしは値が小さく
・σパラメータ → 正規分布の分散のようなもの
直感的な図を描いてみます。
Rで実装
ソースコード: https://gist.github.com/1289543
以下をσを色々変えてアニメーション・y=sin(x) + ガウスノイズ・SVM : library(kernlib) で2クラス分類・プロット
アニメーション(FLASH)
考察
・パラメトリックなカーネル関数は位相構造のテンプレート (パラメータは位相の粒度を調整する)
・ガウシアンカーネルの場合は、 密着位相(粗) ← 小さくなる ← σ → 大きくなる → 離散位相(細) (単純/フィットしにくい) (複雑/過学習)
・本実験の「sin(x)+ノイズ」の場合、最適なσは0.5~1だった → 最適なσを決める基準は交差判定が一般的らしい → 「サポートベクトルの少なさ」も基準になりうると思われる
(4)動画シーンカッター ~Rのbcpパッケージを使って~
bcp(Bayesian Change Point)パッケージ
何か応用できないか? → 動画シーンカッター
カラーヒストグラムとエントロピー
フレーム
カラーヒストグラム エントロピー
R G B
R G B
R G B
= 3.89
= 4.06
= 2.90
→ bcpに食わせる
実装
フレーム切り出し(0.25秒ごと)
カラーヒストグラム作成(フレーム毎)
エントロピー計算(フレーム毎)
Rのbcpパッケージで変化点検出
変化点のフレームを出力
YouTube動画(flvファイル)
Perl
ソースコード(Perl)
金麦CMで検証
いい感じ
エントロピー(Perl)
出力結果
bcpの事後確率 > 0.5
…まぁまぁですかね。
考察・感想
・カラーヒストグラムのエントロピーくらいで、画像の連続的変化をトラッキングできる
・高次元の位相を低次元にマップするような指標なら、同様の手法が使えそう
・bcpパッケージのドキュメントには、「等分散を仮定」と書いてあり、その辺りが「フレームを分類しきれてない原因」かと思われる
・「何らかの前処理」→(数値データ)→「R言語」というパターンで色々なアプリを作っていきたい
(5)高機能電卓としてのR ~2011^(23!) mod 10000 ~
数学問題botより出題
2)が解けなかったので、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プログラムをツイートできた。
考察
・Rは左辺値が変数宣言と見なされるのが電卓的に便利
・無名関数をラムダ式のように使えて便利
・無名関数の再帰が組み込みで便利
・コマンドラインからワンライナーも便利
→ Rでワンライナー、オススメかもです。
おまけ(1) https://gist.github.com/1272737
おまけ(2)
ご清聴ありがとうございました。
(違