olearning-prml8
DESCRIPTION
Learning ML at GrandFront in Osaka, chapter11 source code: https://github.com/u651601f/OLerning-PRMLTRANSCRIPT
Text
Osaka PRML Learning 11Kousuke Takeuchi
CHAPTER 11系列データの分類
文字列のパターン認識文字のパターンを認識するためには、どのようなことを考えていけばよいか?
1. 文字列をバラバラにして、各文字を個別に認識させる。 → これまでのパターン認識のアルゴリズムを適応しやすい。
2. 文字の前後関係の規則性をパターン認識する。 → 文字列の認識精度を向上できる。
1はデータが文字数しかないのに対して、2は文字数+文字の組み合わせの数だけデータがあるので、計算速度が指数的に増えてしまう
SECTION 1系列データのモデル化
文字列から一般モデルへ「あ・い・う・え・お」の組み合わせを考えてみる
文字の長さは5で、組み合わせ総数は5! = 120通り
これを一般的にいうと「パターンの種類 c = 120, 系列の長さ m = 5」となる
k番目のパターンをx(k), k番目のパターンが属するクラスをy(k)で表し、それらのm(=5)個が属するパターンの系列をx, yで表すことにする。
具体的にどんなパターン認識をするのか?
「な・ん・や・そ・れ」の組み合わせを考える
系列の長さ m = 5
「なんやそれ」、「それなんや」、「それやんな」、「やんそれん」・・・などの組み合わせがある。
x(1) =「なんやそれ」、x(2) =「それなんや」、 x(3) =「それやんな」、x(4) = 「やんそれん」・・・
x(1) → y(1) = 疑問、x(2) → y(2) = 理解、x(3) → y(3) = 疑問、x(4), x(5), ・・・ → y(4), y(5),・・・= 意味不明 といった感じでクラス分け
パターン数は「疑問、理解、意味不明」の3つなので、c = 3
cクラスのパターン認識問題をm回解くだけでパターン系列全体を認識できる
前章のロジスティック回帰を用いると・・・
!
!
このクラス事後確率p(y;x)を用いて各パターンを認識
文字をバラバラに認識する場合
連続するパターンを認識する場合「こんにちは、お元気ですか?」という標本をラベル付け → 「あいさつ、疑問」
このラベルの並びからパターン認識すると、「あいさつ、疑問」→「挨拶定式文」
ex) 「お腹すいた、ご飯食べたい」→「状態、主張」→「何らかの催促」
一般化すると、x : 標本 → y : ラベル → z : ラベルとなる
この方法でパターン認識すると、指数的に計算が増えていく
そこで、ひとつ前のパターンのラベルy(k-1)が、ラベルy(k)に影響を与えると仮定する。
つまり、2つの隣り合ったラベルだけで連続的なパターン認識をする。→ c^2クラスと呼ぶ
ex.)「起・承・転・結」を連続パターン認識する場合は、(起, 承)、(承, 転)は認識するが、(起, 転)は認識しない。
このような手法を、条件付き確率場と呼ぶ
条件付き確率場
このq(y|x, ζ)を最大化するパラメータζを学習するので、最尤推定の公式は以下のようになる
SECTION 2 & 3
・条件付き確率場モデルの学習 !
・条件付き確率場モデルを用いた ラベル系列の予測
条件付き確率場モデルを学習し、予測する・・・
「動的計画法」を用いて先ほどの数式を高速化し、より最適な確率場のパターン認識モデルを作成する
・・・と本には書いてありますが、数式が複雑すぎて30分では紹介&解説しきれません。
・・ということで、このセクションは無視して、 とりあえずプログラム書いてみましょう(笑)
テキスト回帰プログラムGithubのREADME.mdを評価する
どんなプログラムかGithubのREADME.mdに対して、☆の数を割り当てたものを訓練標本とする
全体の☆の分布が0~100の場合、50個以上星があれば優秀なREADME.mdという風に分類する
星の数は綺麗に分布していないので、優劣の境界値として、平均値ではなく中央値を採用する。
0
50
100
150
200
0 5 10 15 20
人数
☆の数☆たくさんの人が少ない
☆あんまりない人が多い
0
50
100
150
200
0 5 10 15 20
人数
☆の数
中央値 平均値
ほとんどの人が「劣」に分類されてしまう
今回のデータでは、☆の中央値:171, 平均値:433.9となった
1.README.mdと☆の個数データをJSONにまとめる
2. JSONデータからREADME.mdを取得
rjsonを用いてJSONをパース
RCurlでREADME.mdをGET
Markdownのテキストデータを行列に変換
ロジスティック回帰のライブラリを用いて 優秀なREADME.mdである確率を求める
使用したライブラリ: glmnet, boot → 今回学んだことを全部勝手にやってくれるw
!
この関数によって、学習パラメータζを算出
データを使ってパラメータ算出
x : 先ほどの文字列のデータ
y : ☆の数が中央値よりも大きいなら1、小さいなら0と変換したもの
学習パラメータを使って 新たなREADME.mdを評価する
1.正規化パラメータ: λ
2.先ほど学習した パラメータを使用
3. 新たなmdを評価 !
結果は・・・?
threshold値:171で学習したものを使用
感想
改めてRのライブラリの便利さを思い知らされた
ただし、ライブラリの引数(λなど)の使い方を理解するためにも、ある程度は数学的に理解する必要あり
前回まではMS Officeでスライドを作ってたが、keynote使ったほうが100倍楽。keynote最強。
課題
たまにはサボりましょう。
次回で教科書の学習は最後になるので、残りの時間で作ってみたいサービスを10個くらい考える