ベクトルに対する重回帰分析(各次元独立な時)

何かとあると便利な重回帰分析.
今日はそれを実装してみたいと思います.
matlab とか R とか使えばいいんじゃないのとか言わない.

重回帰分析とは

重回帰分析って,複数の入力から1つの出力を推定するのものですよね.
式で書くと以下のような感じ.

{ \displaystyle
y = \sum_{n=0}^{N-1}a_n x_n + b
}

ここで,{ \displaystyle y}は出力,{ \displaystyle x_n}が入力,{ \displaystyle a_n}が重み,{ \displaystyle b}がバイアスです.
重みとバイアスさえ上手く学習できれば,入力から出力を推定し放題 (∩´∀`)∩ワーイ

で,どない学習したらええねん!   ( ゚Д゚)⊃ 最小二乗法
の説明はウィキペディア先生に任せるとして,{ \displaystyle y} がベクトルの場合を考えたいと思います!

式で書くとこんな感じ.
{ \displaystyle
\mathbf{y} = {\bf Ax} + {\bf b}
}

小文字はベクトル,大文字は行列です.

ここで,
{ \displaystyle
\mathbf{y} = \left[ y_1, y_2, \cdots, y_d, \cdots, y_D \right]^{\mathrm{T}}
} , { \displaystyle
\mathbf{x} = \left[ x_1, x_2, \cdots, x_n, \cdots, x_N \right]^{\mathrm{T}}
} ,

Aは,D×Nの行列,bはD次元のベクトルとなります. すなわち,N次元のベクトルxからD次元のベクトルyへの行列Aとベクトルbを用いて,回帰するという意味の式になります.

それでは,観測データから行列Aとベクトルbを求めていきます.

今,入力データとそれに対応する出力データがそれぞれM個観測されたとします.

その観測されたデータを,入力,出力それぞれにおいて横に並べて,行列にすると・・・

{ \displaystyle
\begin{align}
{\bf Y} = \left[ {\bf y_1, y_2, \cdots, y_m, \cdots, y_M} \right],
{\bf X} = \left[ {\bf x_1, x_2, \cdots, x_m, \cdots, x_M} \right]
\end{align}
}

{ \displaystyle
{\bf Y} = {\bf AX + b}
}

となります.

この式を元に,

{ \displaystyle
\left({\bf Y - (AX + b)}\right)^{\mathrm{T}}\left({\bf Y - (AX + b)}\right)
}

を最小にするAをもめてやります.
ただし,このままでは計算し難いので,Aとbを結合し, { \displaystyle
{\bf A}' = \left[{\bf A, b} \right]
} としてやります.
それに伴い,入力データの各サンプルを { \displaystyle
{\bf x}'_m =  \left[ x_1, x_2, \cdots, x_n, \cdots, x_N, 1 \right]^{\mathrm{T}}
} のような形式にした上で結合し,行列X'を生成します.
そうすることで,
{ \displaystyle
{\bf Y} = {\bf A'X'}
}
と簡略して表すことができます.

後は, { \displaystyle
\left({\bf Y - (A'X')}\right)^{\mathrm{T}}\left({\bf Y - (A'X')}\right)
} のA'に対する微分が=0 になるA'を求めてあげればいい.

結果として,以下の式を実装すれば,重回帰分析が行えます.

{ \displaystyle
{\bf A'} = {\bf Y\left(X'X'^{\mathrm{T}}\right)^{-1}}
}