Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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)




正規分布っぽいのが出た。
横軸[0,1]にすると中心に寄っていく様子が見える。(大数の法則)
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)
正規分布を描いてみる
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.5
y=(xのM次多項式) で係数を最小二乗法で求めたときの
二乗誤差(をデータ数で割ったもの)のグラフ。
(横軸がM,縦軸が二乗誤差)
Rで追試してみた
ソースコードはコチラ: https://gist.github.com/1272638




                                     PRMLと形が違う。。
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)
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
考察
・パラメトリックなカーネル関数は位相構造のテンプレート
 (パラメータは位相の粒度を調整する)

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

・本実験の「sin(x)+ノイズ」の場合、最適なσは0.5~1だった
 → 最適なσを決める基準は交差判定が一般的らしい
 → 「サポートベクトルの少なさ」も基準になりうると思われる
(4)動画シーンカッター
   ~Rのbcpパッケージを使って~
bcp(Bayesian Change Point)パッケージ




何か応用できないか? → 動画シーンカッター
動画シーンカッターを作る
檀れいさん出演 「金麦」 15秒CM   動画再生(youtube)
カラーヒストグラムとエントロピー

                        = 3.89
        R   G   B




                        = 4.06
        R   G   B




フレーム                    = 2.90
        R   G   B

       カラーヒストグラム    エントロピー
                     → bcpに食わせる
実装   ソースコード(Perl)

         YouTube動画(flvファイル)



      フレーム切り出し(0.25秒ごと)
                              Perl
      カラーヒストグラム作成(フレーム毎)

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

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



         変化点のフレームを出力
金麦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)
ご清聴ありがとうございました。




          (違

More Related Content

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