youtubeで見れる「パターン認識と機械学習入門」をもとに機械学習について勉強する。
機械学習とは人間が行なっている認知活動を工学的に実現するうことで,パターン認識とは入力されたデータに対しそのデータが属するクラスを決定することである.
パターン認識の流れ
1.前処理:明らかに不要な情報を捨てる
2.特徴抽出:式別に用いる特徴量を抽出し次元を削減する
3.識別:適切な識別器を用いて識別する
1,2は機械学習の分野によってそれぞれ異なる方法がある.従って大部分は3の識別問題を扱う.3を厳密に書くと以下のようになる.
識別: を特徴空間(有限次実ベクトル空間)とし,
をクラスの集合とする. このとき
パターン認識における識別とは与えられた学習データから識別器$$f: \Omega \to C$$を作ることとする.ここで学習データとは特徴ベクトル(特徴空間の元)とその特徴ベクトルが属するクラスの組みとする.
識別器を生成する一つの例としてテンプレートマッチングがある.これは各クラスに対しそのクラスを代表するベクトルを1つ定める(例えばそのクラスに属する学習データの重心).入力データに対しその代表ベクトルとの距離をそれぞれ測り距離が一番小さいクラスを割り当てる方法である.距離としてEuclid距離を用いたテンプレートマッチングをボルノイ分割という.
1
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
10 rep_vecty = np.random.rand(num_class) * 20
11 imput_vectx = np.random.rand(num_imput) * 20
12 imput_vecty = np.random.rand(num_imput) * 20
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)
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()
識別器を生成する別の例としてk近傍法がある.これは入力データに対し学習データの内近い順にk個選び,一番多いクラスを割り当てる方法である.k近傍法は学習データ量が多くなるほど計算量が多くなる.学習データを全て保存しておく必要がある.
識別器を生成する方法として識別関数を用いる方法がある.
識別関数: を特徴空間(有限次実ベクトル空間)とし,
をクラスの集合とする. 各クラス
に対し関数 $$f_c: \Omega\to \mathbb{R}$$を定める.このとき入力データ
に対し
を最大にするクラス
を割り当てることで識別器を作る.このとき関数
を
識別関数という.
テンプレートマッチングは識別関数を用いた例である.実際入力データと代表ベクトルとの距離は
$$\|x - \mu_c\|^2 = \|x\|^2 - 2< x,\mu_c > +\, \|\mu_c\|^2 $$
より$$f_c= 2< x, \mu_c > - \, \|\mu_c\|^2$$を識別関数とするとを最大とするにおいてととの距離が最小となる.
良い識別器を作る問題は良い識別関数を作る問題へと帰着される.識別関数を作る方法としてパラメタリックモデルがある.これは識別関数の形をパラメータ込みの具体的な形に制限し,その中で良いパラメータを見つけることで良い識別関数を作る方法である.具体的には以下のような例がある.
線形識別関数: を特徴空間(有限次実ベクトル空間)とし,
をクラスの集合とする. このとき$$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})$$を
線形識別関数という.
一般化線形識別関数: を特徴空間(有限次実ベクトル空間)とし,
をクラスの集合とする. $$\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)$$を
一般化線形識別関数という.即ち一度入力データを
で写してから線形識別関数として扱っている.
パラメタリックモデルにおいては良いパラメータをどの様に見つけるかが問題となる.良いパラメータを見つける方法として以下の例がある.
平均二乗誤差最小法: を特徴空間(有限次実ベクトル空間)とし,
をクラスの集合とする. 識別関数を束にした関数を$$\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$$とする.ベクトル
を第
成分が
で他は
であるベクトルとする.学習データ
に対し$$E(f)=\frac{1}{k}\sum_{i=1}^k \|f(x_i)- p_{y_i}\|^2$$を
平均二乗誤差という.これを最小にする様な
を定める.
一般化線形識別関数のケースは平均二乗誤差最小法でパラメータの値を代数的に計算することができる.
に対し$$\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)$$
に関し行列微分すると$$\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)$$である.とおくと$$\frac{\partial E(f)}{\partial \mathbf{A}}= 0 \iff \mathbf{X}^T\mathbf{X}\mathbf{A}=\mathbf{X}^T\mathbf{P}$$が成り立つ.従ってが正則ならば$$\mathbf{A}=(\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{P}$$となる.正則でないときはの擬似逆行列を用いて$$\mathbf{A}=\mathbf{X}^{+}\mathbf{P}$$