情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

線形基底関数モデルの最適解

スポンサーリンク

はじめに

前回、D次元の線形回帰モデルを解きました。

parco1021.hatenablog.com

話を1次元に戻します。線形回帰モデルを解くとイメージとしては下図のようになります。

f:id:Parco1021:20200206165132p:plain



{\displaystyle y=ax+b }の形ですね。しかしこの分布を見ているとこのようにも見えると思います。

f:id:Parco1021:20200206165016p:plain

汚くてすみません!!

このように、直線よりも曲線を用いた方がより分布に合っています。基底関数を用いてこのような曲線の関数を導出することが線形基底関数モデルの考え方です。

基底関数

まず基底関数について説明します。読んで字の如く関数を表現するためのベース、つまり基底となる関数です。もっとざっくり言うとグニャグニャしている線(曲線)を基底関数を組み合わせて表現しよう!といった感じです。…???同じことを言ったような気がしますが次第にわかると思います。

ガウス基底

{\displaystyle Φ_j(x)=exp\left\{-\frac{(x-μ_j)^2}{2s^2}\right\} }

f:id:Parco1021:20200206171820p:plain

引用元:ガウス関数

ただのガウス関数(正規分布)ですね。{\displaystyle s }は分散のようなイメージでいいと思います。つまり大きくするとそれだけ広範囲に影響が出ます(=グラフの山が潰れて広がるイメージ)。広範囲に影響を及ぼすことはよろしくないので小さい方が望ましいと思います。小さすぎるのもアレだけど。。。{\displaystyle μ_j }ガウス関数の中心位置ですね(山のテッペンの位置)。{\displaystyle s,μ_j }ともに設計者が決めるパラメータで変数は当然{\displaystyle x }のみです。

 

多項式基底

{\displaystyle Φ_j(x)=x^j }

つまり{\displaystyle Φ(x)=1,x,x^2,x^3・・・ }となるわけです。こちらの方が馴染みがあるので扱いやすいかもしれません。

 

解いてみよう

まず、今回解く対象である線形基底関数モデルを明記します。

{\displaystyle y(x,\boldsymbol{w})=\sum_{j=0}^{M} w_jΦ_j(x)=\boldsymbol{w}^T\boldsymbol{Φ}(x) }

ここで、{\displaystyle M }対象となるデータを何分割して基底関数を使うかを示しています。そして{\displaystyle w }は重みを表しています。つまり、M=3であるとしたら対象のデータをx軸方向に3分割して分割したそれぞれに適した重みwを計算します。そして導出した最適な重みを先ほど述べた基底関数に掛けることで曲線を実現させます。当然分割した各々は干渉し合います。

…わかりにくいですね。図示します。

f:id:Parco1021:20200206203406p:plain

 

フリーハンドですみません…。このように、M=3であるため3つのガウス基底で表現を試みます。この3つ各々に重みwを掛けて"いい感じ"にします。最後の項{\displaystyle w_3とΦ_3(x) }は係数のための処理です。

 

それでは、重み{\displaystyle \boldsymbol{w} }の最適解を求めていきましょう。タイトルの通り平均二乗誤差Jを使います。

{\displaystyle J(\boldsymbol{w})=\frac{1}{N}\sum_{n=0}^{N-1} (y(x,\boldsymbol{w})-t_n)^2=\frac{1}{N}\sum_{n=0}^{N-1} (\boldsymbol{w}^T\boldsymbol{Φ}(x)-t_n)^2 }

この形、どこかで見覚えがありませんか???そう、線形回帰モデルと同じ形をしています。

{\displaystyle J(\boldsymbol{w})=\frac{1}{N}\sum_{n=0}^{N-1} (\boldsymbol{w}^T\boldsymbol{x}_n-t_n)^2 }parco1021.hatenablog.com

 

{\displaystyle \boldsymbol{x}_nが\boldsymbol{Φ}(x) }へ変わっただけですね。なのでほとんどの処理は線形回帰モデルのものを応用できそうです。

  • 1次元データ{\displaystyle x_nをM次元(≒何分割するか)のベクトル\boldsymbol{Φ}(x_n) }に変換
  • {\displaystyle M次元入力された各入力\boldsymbol{x}_n }に対して線形回帰モデルを解く

以上のようにすることで線形回帰モデルと同様に処理することが可能であると考えられます。

つまり{\displaystyle 重み\boldsymbol{w} }の最適解は

{\displaystyle \boldsymbol{w}=(\boldsymbol{Φ}^T\boldsymbol{Φ})^{-1}\boldsymbol{Φ}^T\boldsymbol{t} }

となります。但し、

f:id:Parco1021:20200206202538p:plain

このような基底関数をN行M列に並べたものを計画行列(デザイン行列)と言います。

今回はxを一次元入力としましたが、仮にxが多次元であっても{\displaystyle x_n→\boldsymbol{x}_n }とすることで同様に扱うことができます。

 

参考文献

Pythonで「線形回帰」と"確率版の線形回帰"である「ベイズ線形回帰」 - Qiita

第9回 線形回帰[後編]:機械学習 はじめよう|gihyo.jp … 技術評論社

計画行列(デザイン行列)とは何か:PRML編 - 北野坂備忘録

ガウス基底モデル(μ, σランダム調整モデル)

 

 

おわり。

もしよければ↓ぽちっと↓お願いします。

ブログランキング・にほんブログ村へにほんブログ村

 

PVアクセスランキング にほんブログ村

 

スポンサーリンク