機械学習勉強ログ

機械学習に関連した勉強を記録していこうと思います。

線形代数の基本的な計算(2) ~内積、対角行列、拡大変換~

前回は、ベクトル、行列の基本的な計算方法について記載しましたが、

内積の計算方法さえわかれば、行列の基本的な計算ができることが分かりました。

今回は、前回保留にしていた 内積 の意味を見出していこうと思います。

内積を使ってベクトルの成分を取り出す

今回は、点

 p_1=(1, 2)^T

のベクトルを例にとって、

内積を使って何ができるか見ていきたいと思います。

f:id:fugafigs:20190330161436p:plain:w300

まず、点p1 を図示していくと、上記のような感じになります。

例1 : ベクトルからXとYのそれぞれの成分をスカラーとして取り出してみる。

X成分の場合

f:id:fugafigs:20190330145458p:plain:w300

これは、係数として

 a_x=(1, 0)

をかけてあげれば、Xの成分 + Yの成分*0 になるので、結果的にX成分が残る ことになります。

式として表現すると下記になります。

 p_x=a_x \cdot p_1=1

Y成分の場合

f:id:fugafigs:20190331002124p:plain:w300

これは、先ほどと逆で、Y成分側を1にしたベクトルをかけてあげれば、Y成分が残ることになります。

 a_y=(0, 1)

式として表現すると下記になります。

 p_y=a_y \cdot p_1=2

例2: 成分を整数倍する

f:id:fugafigs:20190330150455p:plain:w300

試しにX成分を2倍しました。これは、

 a_x=(2, 0)

整数倍したい成分のところに倍数を入れるだけです。簡単ですね。

式として表現すると下記になります。

 p_x=a_x \cdot p_1=2

例3: Xを3倍して、Yを2倍にする(そして、ベクトルで結果を返す)

f:id:fugafigs:20190330152737p:plain:w300

これは、例1例2の組み合わせで表現できます。

式として表現すると下記になります。


A=\begin{pmatrix}
3 & 0\\\
0 & 2
\end{pmatrix}

 p=A \cdot p_1=(3,4)^T

Xの成分に3倍するベクトルYの成分を2倍するベクトル を行列にしてドット積をとると、

各成分に対する操作を合成できて、結果がそれぞれの要素となるベクトルになっています!

ちなみに、この結果をグラフでみると次のようになります。

f:id:fugafigs:20190330153444p:plain:w300

ちゃんと、座標が大きくなっていますね。 Aという行列を掛けるという操作が座標を拡大 に対応していることが分かりました。

ここで出てきた、Aのように行列の斜めの成分以外がゼロになっている行列を 対角行列 というそうです。

対角行列を使って、長方形を拡大する

先ほどは、点Pを拡大してみましたが、今度は点の集合体である長方形を拡大してみようと思います。

f:id:fugafigs:20190330155736p:plain:w300

試しに上図のような長方形を拡大しようと思います。長方形は、次のような4つの点のベクトルの集まりです。

 p_1=(1, 2)^T
 p_2=(0, 2)^T
 p_3=(0, 0)^T
 p_4=(1, 0)^T

これは、行列としても表現できます。


B=\begin{pmatrix}
1 & 0 & 0 & 1\\\
2 & 2 & 0 & 0
\end{pmatrix}

上のような感じ。(Bとしたのは、Boxを意図して)

先ほどの拡大行列を掛けると、拡大行列がそれぞれの点に対して分配されるので見事、長方形が拡大されます。

f:id:fugafigs:20190330155953p:plain:w300

グラフで見ると、下図のようになります。

f:id:fugafigs:20190331002651p:plain:w300

ちょっとだけ、これを抽象化すると

f:id:fugafigs:20190330160405p:plain:w400

点の集まりであるB1という長方形拡大行列であるAを掛けると、拡大後の長方形であるB2が得られるという感じになります。

これは、すごい。!

個別に式を作っていたら、このような簡潔な式にはならないと思いますが、これが 線形代数の表現力 の賜物なのかと思いました。😁

まとめ

  • まずは、内積が有効活用できる事が分かってよかったと思います。

  • ベクトルの内積とそれを発展させた行列のドット積を使う事で、座標の拡大という操作を行う 事ができました。

  • 座標の拡大は単一座標に対してだけでなく、複数の座標群に対してまとめて適用する 事もできました。

  • 抽象的な視点で見ると、ベクトルや行列を使うことで、複数の要素からなる数値の集合体に意味を与えて、まとめて操作することができることが分かった点も非常によかったと思います。

個人的な感想として線形代数を学んだ事で今まで数学に対して持っていた知識が手続き型プログラミングレベル ぐらいだったのが、構造化プログラミングレベル ぐらいにバージョンアップした感じがして嬉しいです。😄

次回は、今回の発展系として 回転行列 と、(可能であれば)ベクトルの次元を増やして 3次元の座標を扱ってみたい と思います。