バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia2-backnumber/
はじめに
正規方程式を導出するまでの説明。
今回は二次形式の行列表現の計算方法を最適化する仕掛けの話。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ロードマップ【再掲】
一応ロードマップ再掲。
この図としては、二次形式のところが該当するな。
二次形式のところだけでも結構ごたついてるんだよなぁ。
二次形式の行列表現【再掲】
二次形式に行列表現も再掲しておこう。
\(
\begin{eqnarray}
\Bigg(
\begin{bmatrix}
a_{11} && a_{12} && \dots && a_{1n} \\
a_{21} && a_{22} && \dots && a_{2n} \\
\vdots && \vdots && \ddots && \vdots \\
a_{n1} && a_{n2} && \dots && a_{nn}
\end{bmatrix}
\begin{bmatrix}
x_1\\
x_2\\
\vdots\\
x_n
\end{bmatrix}
\Bigg)^T
\begin{bmatrix}
x_1\\
x_2\\
\vdots\\
x_n
\end{bmatrix}\\=
\begin{bmatrix}
x_1\\
x_2\\
\vdots\\
x_n
\end{bmatrix}^T
\begin{bmatrix}
a_{11} && a_{12} && \dots && a_{1n} \\
a_{21} && a_{22} && \dots && a_{2n} \\
\vdots && \vdots && \ddots && \vdots \\
a_{n1} && a_{n2} && \dots && a_{nn}
\end{bmatrix}
\begin{bmatrix}
x_1\\
x_2\\
\vdots\\
x_n
\end{bmatrix}\\=
x^TAx
\end{eqnarray}
\)
ベクトルxを複数セットするには?
\(x\)はベクトルだから、ここに全座標を入れてあげれば、二次形式の計算結果が一括で得られそうだね。
\(x\)が一つにまとまっていればね。
え゛?
\(x^TAx\)の\(x\)をベクトルから行列にすればOKと思ってるようだけど、
このままだと\(x^T\)と\(x\)は別のベクトルとして計算されるので、期待した結果は得られない。
まぁベクトルを行列にせずにfor文で回せば良いだけではあるが・・・。
じゃーfor文で回そう!
いやいや!そうしないための仕掛けを今回入れるの!!
じゃー、その仕掛けをよろしく。
仕掛け
行列同士の積は、複数回の内積を実施しているに過ぎない。
内積は分解すると、アダマール積と1の定数関数の畳み込みに分解できる。
また、よくわからん言葉が・・・。
アダマール積は以前やったけど。
1の定数関数は常に1になる関数ってだけだ。
以下のように変形する。
\(x\)は各変量の全空間の座標を持った行列とする。
\(
x^TAx=x^TA\circ x^T
\begin{bmatrix}
1\\
\vdots\\
1
\end{bmatrix}
\)
なんで、こうなるかがわからん。
\(x^T\)と\(x\)を行列として積と取ると、直積をとったような関係になって、
計算結果が\(x\)の1要素に対して\(x\)の全要素の積を\(x\)の全要素分になって、行列が拡張されちゃう。
それを抑制するためにアダマール積で内積の途中まで計算させておいて、定数関数で内積を取り直すことで直積のような関係を解消している。
「\(x\)の1要素に対して\(x\)の全要素の積を\(x\)の全要素分」ってのでちょっとイメージ沸いたかな?
\(x\)の積を内積の手順を分解してうまくコントロールしたってことか。
まぁ、その認識でOKだ。
まとめ
- 二次形式の行列表現をfor文を使用せずに一括計算するための仕掛けを考える。
- 内積を分解してアダマール積と定数関数との内積にする。
- これにより、x^Tとxの直積的な結果を抑制。
バックナンバーはこちら。
コメント