線形変換とベクトル描画 : 線形代数をPythonで<5>


線形代数

理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ!あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。

環境

・JupyterNotebook
・言語:Python3, Julia1.4.0

線形変換

行列Aをベクトルvにかけたとき、Avに変換するという表現を用いる。別の言い方をすると、vを入力して、T(v)=Avを出力するという。このときのTは関数扱い。
このことから線形であるとするための条件は、線形代数の核ともいえる線形結合の形に似ている。
確認のために。

線形結合

引用元:https://qiita.com/jin237/items/ebeae3018b5ab190c2bf

線形結合はスカラー積ベクトル和によって構成される。
2つのスカラーをa,bとして、ベクトル和をv,wとする。

スカラー積は、

av,bw

のように掛けられたもの。

ベクトル和は、

v + w

のように足されたもの。
これら二つの組み合わせを線形結合という。よって、

av + bw

のような形のことである。ちなみにこれは項数が2つなので、2次元面を張る。(v=w>の場合、違うが。)

このことから得られる線形変換は、以下のようになる。

線形変換

引用元:線形代数イントロダクション/ストラング

変換Tはん入力されたVの各ベクトルvに対して出力T(v)をしている。変換Tはすべてのvとwに対して以下の条件を満たすとき、線形であるという.

(a) : T(v+w)  =T(v) + T(w)\\
(b) : T(cv) = cT(v),すべてのcに対して.

文章はそんなに気にしなくていいので、式に注目してもらえればわかる。
このことから言えるのが、

T(cv+dw)  =cT(v) + dT(w)

が成り立つということだ。

線形変換について書くと膨大な量になりそうなので、軽くここまでにする。プログラムをしよう。

ベクトルの描画

線形変換することにより、ベクトルを変換できることが上からわかる。これは人工知能ではニューラルネットワーク上における情報伝達させるために使う。
とりあえず、ベクトルをグラフ上で表してみる。

\vec{a}=
\begin{pmatrix}
2 \\
3
\end{pmatrix}
,
\vec{b}=
\begin{pmatrix}
1 \\
-2
\end{pmatrix}

というベクトルを描写する。今回からmatplotlibを使う。

pythonコード(ベクトルの描画)
5pythonvectordrawing.py
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt


plt.quiver(0, 0, 2, 3, angles="xy", scale_units="xy", scale=1, color="red")
# plt.text(2.3, 2.5, "[2, 3]", color = "red", size =13)
plt.quiver(0, 0, 1, -2, angles="xy", scale_units="xy", scale=1, color="blue")
# plt.text(1.3, -2, "[1,-2]", color = "blue", size = 13)


plt.xlim([-6,6])  
plt.ylim([-6,6])  
plt.xlabel("x", size=10)
plt.ylabel("y", size=10)
plt.grid(color = "black")
plt.grid(which = "minor", axis = "x", color = "gray", alpha = 0.8,
        linestyle = "--", linewidth = 1)
plt.grid(which = "minor", axis = "y", color = "gray", alpha = 0.8,
        linestyle = "--", linewidth = 1)
plt.axes().set_aspect("equal")  
plt.title('Vectors')
# plt.savefig('vector.png')
plt.show()
結果(グラフ)

コードの解説
%matplotlib inline
import matplotlib.pyplot as plt

↑ 
 インポートする際にjupyternotebookでグラフを書く場合に使われるのでセットで覚えておくとよい。

plt.quiver(0, 0, 2, 3, angles="xy", scale_units="xy", scale=1, color="red")
plt.quiver(0, 0, 1, -2, angles="xy", scale_units="xy", scale=1, color="blue")

↑ 
 ベクトルの描画するために、quiver()関数を用いる。ちなみにquiverは日本語で直訳すると「小刻みに震える」のような意味になるが、数学上では箙(えびら)と呼ばれる。中身は調べて(笑)
quiver関数の表し方は、

quiver(始点のx, 始点のy, 矢印のx成分, 矢印のy成分, 
       angle=矢印の角度決定方法, scale_units="スケール単位", 
       scale=スケール, color=矢印の色)

のようにして書く。
そのあとのコードについては後日別の記事で、matplotlibの扱い方について書くつもり。

ベクトル計算を含めた描画

\vec{a}=
\begin{pmatrix}
2 \\
3
\end{pmatrix}
,
\vec{b}=
\begin{pmatrix}
1 \\
-2
\end{pmatrix}

二つのベクトルの関係は、Aa=bで表すと、

A\vec{a}=
\begin{pmatrix}
2 & -1\\
2 & -2
\end{pmatrix}
\begin{pmatrix}
2 \\
3
\end{pmatrix}
=
\begin{pmatrix}
1 \\
-2
\end{pmatrix}
=\vec{b}

という関係であるこれを表すグラフは同様であるが、計算したものをプログラムに表すのには上とは異なる方法となる。

pythonコード(ベクトル計算を含めた描画)
5pythonvectorcalc.py
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt


def arrow(start, size, color):
    plt.quiver(start[0], start[1], size[0], size[1], 
               angles="xy", scale_units="xy", scale=1, color=color)
a = np.array([2,3])
A = np.array([[2, -1],
              [2, -2]])
b = np.dot(A, a)
s = np.array([0, 0])


arrow(s, a, color="red")
arrow(s, b, color="blue")
plt.xlim([-6,6])  
plt.ylim([-6,6])  
plt.xlabel("x", size=10)
plt.ylabel("y", size=10)
plt.grid(color = "black")
plt.axes().set_aspect("equal")  
plt.title('Vectorscalc')
plt.savefig('vectorcalc.png')
plt.show()
結果(グラフ)

defからのところに関数を定義として入れ、計算した値をそのまま代入してベクトルとして表示できるようにした。コード量が多くなるので、補助目盛とテキストはなくした。

最後に

今回は線形変換の最初の方をやってきた。実質、matplotlibゲーだったが、後日出すのでとりあえずはquiver()関数というものがあるということを知っておこう。