参考書
本ブログの内容の詳細は、「機械学習スタートアップシリーズ ゼロからつくるPython機械学習プログラミング入門」に掲載されています。
機械学習に必要な数学の復習から、機械学習のアルゴリズムの導出およびPythonの基本ライブラリのみを用いた実装方法まで学びたい方は、本書籍をご活用ください。
bookclub.kodansha.co.jp
非線形な関数の回帰
これまでは、入力と出力の関係が線形な場合の回帰の例を見てきまし。しかしながら、現実のデータがこのように都合よく線形な関数になっているとは限りません。そこで、ここからは入力と出力の関係が非線形な場合の回帰を考えていきます。まず、以下のようにregressionData.artificialメソッドを実行する際に「isNonlinear=True」を指定し、非線形なデータを生成してみましょう。
import regressionData as rg myData = rg.artificial(200,100, dataType="1D", isNonlinear=True) myData.plot()
さて、これに対して線形モデルで回帰した結果は以下のような直線(赤)となるため、非線形な曲線を表現できていないことがわかります。
カーネルモデルの導入
線形モデルを非線形な曲線でも回帰できるようにするために、非線形な表現力を持つカーネルモデルを導入します。
まず、任意の入力ベクトルおよび個の学習データを非線形関数を用いて高次元空間に写像します。
そして、高次元ベクトルととの内積を計算し、モデルパラメータとの線形和を求めます。つまり、カーネルモデルでは、モデルパラメータは次元のベクトルとなっています。
分類におけるカーネルモデルのイメージ
カーネルトリックとカーネル関数の例
超高次元(無限次元の場合もあり)空間上での内積を計算するカーネル関数の実装は容易ではありません。カーネル関数を効率よく計算するために、以下の特性を持つ正定値カーネル関数を導入ます。
正定値カーネル関数には以下のようなものがあります。
これらの正定値カーネルにより、高次元空間上での内積の計算を、例えばガウスカーネル関数の計算に置き換えることができるため、非常に効率よく計算することができます。ただし、正定値カーネルを有効的に利用するためには、ハイパーパラメータをデータに合わせて調整する必要があるので注意しましょう。
カーネルモデルの線形性
カーネルモデルは、入力に対しては非線形な関数になっていますが、モデルパラメータとに対しては線形性を維持しています。そのため、線形モデルと同様に最小二乗法を用いて解析的にモデルパラメータを最適化できるのが特徴となっています。
演習5
2つのデータ集合間の全ての組み合わせのユークリッド距離の計算する関数calcDistを実装しましょう。
#------------------------------------ # 6) 2つのデータ集合間の全ての組み合わせの距離の計算 # x: 行列(次元 x データ数) # z: 行列(次元 x データ数) def calcDist(self,x,z): #【行列xのデータ点x1, x2, ..., xNと、行列zのデータ点z1, z2, ..., zMとの間のMxN個の距離を計算】 return dist #------------------------------------※for文を用いずに行列演算のみで実装しましょう。
※ヒント:「次元xデータ数」の行列xとzとをそれぞれ、「xのデータ数 x zのデータ数 x 次元」の行列に変形することにより行列演算で実装できます。
演習6
ガウスカーネル関数を題材に、カーネル行列(グラム行列)を計算するメソッドlinearRegression.kernelを実装しましょう。
#------------------------------------ # 5) カーネルの計算 # x: カーネルを計算する対象の行列(次元 x データ数) def kernel(self,x): #【self.xの各データ点xiと行列xの各データ点xjと間のカーネル値k(xi,xj)を各要素に持つグラム行列を計算】 return K #------------------------------------ <span style="color: #ff0000">※コンストラクタ「__init__(self, x, y, kernelType="linear", kernelParam=1.0)」にて設定している2つのインスタンス変数self.kernelType(カーネルの種類)とself.kernelParam(ハイパーパラメータ)を利用して、カーネルの切り替えおよび計算を行うように実装しましょう。</span>
演習7
カーネルモデルのパラメータを最適化するメソッドlinearRegression.trainMatKernelを実装しましょう。
※行列のランク落ちにより逆行列の計算が不安定になる場合があります。その場合は、以下のように行列の対角成分に小さな正の値を加算してから、逆行列を計算しましょう。
ここで、およびは単位行列です。
ガウスカーネル回帰の結果例
【、の場合】
予測(赤い点)が、テストデータ(黄の点)に近く非線形な曲線をスムーズに近似できていることがわかります。
【、の場合】
今度はガウスの幅をに設定して狭くしてみます。
の時とくらべ、予測(赤い点)がガタガタになっていて、ところどころテストデータ(黄の点)から外れているのがわかります。
【、の場合】
今度はガウスの幅をに設定して、広くしてみます。
の時とくらべ、今度は予測(赤い点)がスムーズになりすぎて、テストデータ(黄の点)をよく近似できていないがわかります。
このように、カーネルモデルを用いた線形回帰により非線形な関数を回帰するためには、カーネルのハイパーパラメータをデータに合わせて調整する必要があることがわかります。