機械学習とパターン認識

youtubeで見れる「パターン認識と機械学習入門」をもとに機械学習について勉強する。

第一回

 機械学習とは人間が行なっている認知活動を工学的に実現するうことで,パターン認識とは入力されたデータに対しそのデータが属するクラスを決定することである.

パターン認識の流れ

1.前処理:明らかに不要な情報を捨てる

2.特徴抽出:式別に用いる特徴量を抽出し次元を削減する

3.識別:適切な識別器を用いて識別する

1,2は機械学習の分野によってそれぞれ異なる方法がある.従って大部分は3の識別問題を扱う.3を厳密に書くと以下のようになる.

識別:  \Omegaを特徴空間(有限次実ベクトル空間)とし,C= \{ c_1,c_2, \dots ,c_n \}をクラスの集合とする. このときパターン認識における識別とは与えられた学習データから識別器$$f: \Omega \to C$$を作ることとする.ここで学習データとは特徴ベクトル(特徴空間の元)とその特徴ベクトルが属するクラスの組みとする.

 識別器を生成する一つの例としてテンプレートマッチングがある.これは各クラスcに対しそのクラスを代表するベクトルを1つ定める(例えばそのクラスに属する学習データの重心).入力データに対しその代表ベクトルとの距離をそれぞれ測り距離が一番小さいクラスを割り当てる方法である.距離としてEuclid距離を用いたテンプレートマッチングをボルノイ分割という.

  1 # coding: utf-8                                                                                                    
  2 
  3 # テンプレートマッチング実装
  4 import numpy as np
  5 import matplotlib.pyplot as plt
  6 import matplotlib.cm as cm
  7 num_class = 8                                 # クラスの数
  8 num_imput = 500                               # 入力データの個数
  9 rep_vectx = np.random.rand(num_class) * 20    # 代表ベクトルのx座標
 10 rep_vecty = np.random.rand(num_class) * 20    # 代表ベクトルのy座標
 11 imput_vectx = np.random.rand(num_imput) * 20  # 入力データのx座標
 12 imput_vecty = np.random.rand(num_imput) * 20  # 入力データのy座標
 13 rep_vects = np.array([[rep_vectx[i], rep_vecty[i]] for i in range(num_class)])
 14 imput_vects = np.array([[imput_vectx[i], imput_vecty[i]] for i in range(num_imput)])
 15 
 16 if __name__ == "__main__":
 17     def ecld_metric(x, y):
 18     ¦   # ユークリッド距離
 19     ¦   return (x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2
 20 
 21     d = ecld_metric  # 距離函数を指定
 22     metric_matrix = np.array([[d(a, b) for a in imput_vects] for b in rep_vects])
 23     class_matrix = np.argmin(metric_matrix, axis = 0)  # 各入力データに対し距離が一番小さいクラスのindexを取得
 24     
 25     for j in range(num_imput):
 26     ¦   plt.scatter(imput_vects[j][0], imput_vects[j][1], color = cm.prism(class_matrix[j] / float(num_class)))
 27     ¦   
 28     for i in range(num_class):
 29     ¦   plt.scatter(rep_vects[i][0], rep_vects[i][1], color = cm.prism(i / float(num_class)), edgecolor = "black")
 30     
 31     plt.show()

f:id:kyastel:20180206140016p:plain

 識別器を生成する別の例としてk近傍法がある.これは入力データxに対し学習データの内近い順にk個選び,一番多いクラスを割り当てる方法である.k近傍法は学習データ量が多くなるほど計算量が多くなる.学習データを全て保存しておく必要がある.

 識別器を生成する方法として識別関数を用いる方法がある.

識別関数:  Oを特徴空間(有限次実ベクトル空間)とし,C= \{ c_1,c_2, \dots ,c_n \}をクラスの集合とする. 各クラスc \in Cに対し関数 $$f_c: \Omega\to \mathbb{R}$$を定める.このとき入力データ xに対しf_c(x)を最大にするクラスc \in Cを割り当てることで識別器を作る.このとき関数 f_c識別関数という.

 テンプレートマッチングは識別関数を用いた例である.実際入力データxと代表ベクトル \mu_cとの距離は

$$\|x - \mu_c\|^2 = \|x\|^2 - 2< x,\mu_c > +\, \|\mu_c\|^2 $$

より$$f_c= 2< x, \mu_c > - \, \|\mu_c\|^2$$を識別関数とするとf_cを最大とするcにおいてx\mu_cとの距離が最小となる.

 良い識別器を作る問題は良い識別関数を作る問題へと帰着される.識別関数を作る方法としてパラメタリックモデルがある.これは識別関数の形をパラメータ込みの具体的な形に制限し,その中で良いパラメータを見つけることで良い識別関数を作る方法である.具体的には以下のような例がある.

線形識別関数:  \Omega = \mathbb{R}^mを特徴空間(有限次実ベクトル空間)とし,C= \{ c_1,c_2, \dots ,c_n \}をクラスの集合とする. このとき$$f_c(x,a_c,b_c)= a_{c1}x_1 + a_{c2}x_2 + \cdots a_{cm}x_m + b_c\,\,\,\,\,\,(a_c \in \mathbb{R}^m,\,b_c \in \mathbb{R})$$を線形識別関数という.

 

一般化線形識別関数:  \Omegaを特徴空間(有限次実ベクトル空間)とし,C= \{ c_1,c_2, \dots ,c_n \}をクラスの集合とする. $$\Phi: \Omega \to \mathbb{R}^m,\,\,\,\Phi(x)= (\phi_1(x),\phi_2(x), \dots , \phi_m(x))^{T}$$が与えられているとする.このとき$$f_c(x,a_c) = a_c^{T} \cdot \Phi(x)\,\,\,\,\,\,(a_c \in \mathbb{R}^m)$$を一般化線形識別関数という.即ち一度入力データを\Phiで写してから線形識別関数として扱っている.

パラメタリックモデルにおいては良いパラメータをどの様に見つけるかが問題となる.良いパラメータを見つける方法として以下の例がある.

平均二乗誤差最小法:  \Omegaを特徴空間(有限次実ベクトル空間)とし,C= \{ c_1,c_2, \dots ,c_n \}をクラスの集合とする. 識別関数を束にした関数を$$\mathbf{f}(x)=(f_{c_1}(x,a_{c_1}),f_{c_2}(x,a_{c_2}), \dots ,f_{c_n}(x,a_{c_n}))^T$$とする.ベクトル\mathbf{p}_iを第i成分が1で他は0であるベクトルとする.学習データ(x_i,y_i)_{i=1}^{k}に対し$$E(f)=\frac{1}{k}\sum_{i=1}^k \|f(x_i)- p_{y_i}\|^2$$を平均二乗誤差という.これを最小にする様なa_cを定める.

一般化線形識別関数のケースは平均二乗誤差最小法でパラメータの値を代数的に計算することができる.

\mathbf{\Phi}(x)=(\phi_1(x),\phi_2(x),\dots \phi_n(x))^T, \mathbf{A}=(\mathbf{a_{c_1}},\mathbf{a_{c_2}},\dots \mathbf{a_{c_n})^T})に対し$$\mathbf{f}(x)=\mathbf{A}^T\Phi(x)$$とする.このとき$$\sum_{i=1}^k \|\mathbf{f}(x_i)-\mathbf{p}_{i}\|^2=\sum_{i=1}^k (\mathbf{\Phi}^T(x_i)\mathbf{A}\mathbf{A}^T\mathbf{\Phi}(x_i) -2\mathbf{\Phi}^T(x_i)\mathbf{A}\mathbf{p_i} + \|p_i\|^2)$$

\mathbf{A}に関し行列微分すると$$\frac{\partial E(f)}{\partial \mathbf{A}} = \sum_{i = 1}^k 2(\mathbf{\Phi}(x_i)\mathbf{\Phi}^T(x_i)\mathbf{A} - \mathbf{\Phi}(x_i)\mathbf{p}^T_i)$$である.\mathbf{X}=(\mathbf{\Phi}(x_1),\mathbf{\Phi}(x_2),\dots ,\mathbf{\Phi}(x_k))^T,\, \mathbf{P}=(\mathbf{p}_1,\mathbf{p}_2, \dots ,\mathbf{p}_k)^Tとおくと$$\frac{\partial E(f)}{\partial \mathbf{A}}= 0 \iff \mathbf{X}^T\mathbf{X}\mathbf{A}=\mathbf{X}^T\mathbf{P}$$が成り立つ.従って\mathbf{X}^T\mathbf{X}が正則ならば$$\mathbf{A}=(\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{P}$$となる.正則でないときは\mathbf{X}の擬似逆行列\mathbf{X}^{+}を用いて$$\mathbf{A}=\mathbf{X}^{+}\mathbf{P}$$