Personal tools
You are here: Home ブログ 学習経過 Haskell で線形識別関数の学習を行う
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
sysfs tips 02 ohyama 2010-09-09
sysfs tips ohyama 2010-09-02
Haskell で周波数スペクトルを得る ohyama 2010-07-29
Haskell で線形識別関数の学習を行う ohyama 2010-07-19
Haskell で逆行列を求める ohyama 2010-07-16
Recent comments
Re:vim に lisp 機能をつける t.mimori 2010-12-16
Re:Haskell で周波数スペクトルを得る H.OHYAMA 2010-08-01
Re:lkml でお勉強 (その1-1) Hiroyasu OHYAMA 2009-08-21
Re:lkml でお勉強 (その1-1) kosaki 2009-08-20
Re:vim に lisp 機能をつける ohyama 2008-05-08
Categories
学習経過
GNU/Linux
 
Document Actions

Haskell で線形識別関数の学習を行う

  これまでに作ってきた行列演算の応用として、パターン認識の分野での識別関数の学習処理を行う。

  ここで言う学習とは、特徴空間においてクラスを分断する領域を推定する事である。
  今回は識別関数の中でも、特徴空間において線形にクラスを分離する識別面の学習を行う。
  下記の資料で、これについてわかりやすく解説している。以下のプログラムの内容は、同資料の p39 - 42 の内容になる。

  http://www3.sys.es.osaka-u.ac.jp/iwai/slc/H16/01intro.pdf

  資料だけでは分かりづらいので、p41 の内容を補足する。
  資料にもあるように出力と教師信号の誤差の二乗なので、評価関数は ω の二次関数になっている。
  誤差 (出力と教師信号の差) を最小にする識別面を取得したいので、評価関数の最小値を取得すればよい。資料にもあるように、評価関数は誤差の二次関数であり、誤差は ω  の関数なので、


  01        [1]

  が評価関数 J の極小値になる。ここで w_i はクラス i におけるパラメータベクトルを表す。
  また、クラス i における p 番目の入力を z_p としたとき


02      [2]

  より


03           [3]

  なので、あるクラス i の全ての入力に対する評価関数を最小にするパラメータを求めるには、

04                  [4]

  を満たす ω  を各クラスについて求めればよい。

  ここで Haskell プログラムについて見る前に、線形識別関数 g_i(z) について考える。
  d 次元の入力 z における g_i(z) は


05           [5]

  と考えられる。ここで w_{ij} (j = 1 ... j) は、識別面の法線ベクトルであり、w_{i0} は識別面 (境界) のバイアスになる。
  ここで、d 次元ベクトルである z = (z_1, z_2, ... , z_d) を
 
06                         [6]

  として (d + 1) 次元にする事で、上記の識別関数を

07                     [7]

  で表す。ここで、


08-09

  とする。なお、z_i (i=0 ... p) は 上記の (d + 1) 次元ベクトルを表すので、Z は p * (d+1) 行列となる。
  ここで (4) よりあるクラス i に関して

10       [8]

11                  [9]

12     [10]

  として、識別面の法線ベクトル w_i が求められる。

  ここで作成した Haskell プログラムを見る。以下に、コード全体のリンクと、追加部分のコードを記載する。

  ソースコード


getPrototype xs tv = let lMx = expandDimension xs
lMxt = transpose lMx
ilMx = inverseMatrix $ lMxt /**/ lMx
in (ilMx /**/ (toRatio lMxt)) /**/ (transpose $ map (\x -> map (\y -> (y%1)) x) tv)

expandDimension :: [[Int]] -> [[Int]]
expandDimension mx = map (\xs -> 1:xs) mx


  ここでは一次元空間における 2 クラス問題について考え、クラス 1 に属する学習パターンを


inputZ


  とし、教師ベクトルを

tSignal.png

  としている。

  新たに作成した関数は 2 つだけである。
  expandDimention 関数で入力パターン Z の次元の拡張をし、getPrototype 関数で、これまで作ってきた行列演算を行う関数を呼び出し、[10] 式を解いている。

  出力結果は次のようになる。

  [[(-115)%687],[184%687]]

  つまり、学習した識別関数は

result

  となる。グラフに出力すると次のようになる。

graph



  パターン出力の推定を行わない学習 (ノンパラメトリック学習) による識別関数の学習手法は他にも、パーセプトロンの学習規則や Widrow-Hoff の学習規則などの有名な手法が提案されているが。これら解析的に求める手法とは違い、ここでは評価関数を最小にするという観点から偏微分を行い、方程式を解くだけで識別面の学習が行えるという、非常にリーズナブルな手法である。
  このの手法はとっても便利で、一見万能そうだが。[10] 式中の (Z^t Z) の逆行列が存在しなかったり、教師ベクトルを適切に設定しないと所望の識別面は得られない。


・おわりに

  今回作成したプログラムの入力は 1 次元のリストだったが。 Haskell では行列演算のみ定義しているので、同一のプログラムで次元数をいくらでも増やすことができる。

Category(s)
学習経過
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/ohyama/haskell-7dda5f628b58522595a26570306e5b667fd23092884c3046/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.