MATLAB,Python,Scilab,Julia比較 第2章 その32【対称行列と二次形式④】

MATLAB,Python,Scilab,Julia比較 第2章 その32【対称行列と二次形式④】 数値計算
MATLAB,Python,Scilab,Julia比較 第2章 その32【対称行列と二次形式④】

バックナンバーはこちら。
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の直積的な結果を抑制。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました