Pythonで行列の線形変換を可視化する

Posted: , Category: 可視化 , 数学 , 線形代数

行列の線形変換によって、どのようにベクトルが変化するでしょうか。

また、正方行列においては行列式というスカラーの値が定義できますが、これらは幾何学的にどのような意味を有しているのでしょうか。

今回はPythonで可視化して確認してみます。

Pythonでベクトルを線形変換する

2次元平面において、ベクトルに対して行列をかけることで、そのベクトルの値を変換することができます。

具体例として、x, y座標平面上に、(0, 0), (10, 0), (10, 10), (0, 10)の4点からなる、1辺が10の正方形を考えます。そこに、次のような行列Aをかけ、これらの座標を線形変換してみます。

\begin{equation}
\begin{split}
A = 
\begin{pmatrix}
2 & 1 \\
2 & 2
\end{pmatrix}
\end{split}
\end{equation}
import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2, figsize=(10, 5) ,dpi = 80)

for idx, ax in enumerate(axes):
    ax.set_xlim([-20, 50])
    ax.set_ylim([-20, 50])

points = np.array([[0, 0], [0, 10], [10, 10], [10, 0]])
x_points = points[:, 0]
y_points = points[:, 1]
size = len(x_points)

for i in range(size):
    axes[0].plot(x_points[i], y_points[i], marker="o")
    axes[0].plot([x_points[i], x_points[(i+1) % size]], [y_points[i], y_points[(i+1) % size]], ls=":", lw="1", c="black")

axes[0].fill(x_points, y_points, color="y", alpha=0.5)
    
A = np.array([[2, 1], [2, 2]])
points = np.dot(A, points.T).T
x_points = points[:, 0]
y_points = points[:, 1]

for i in range(size):
    axes[1].plot(x_points[i], y_points[i], marker="o")
    axes[1].plot([x_points[i], x_points[(i+1) % size]], [y_points[i], y_points[(i+1) % size]], ls=":", lw="1", c="black")
    
axes[1].fill(x_points, y_points, color="y", alpha=0.5)

結果としては、元の正方形は右のような平行四辺形になるような変換をされました。

実は、ベクトルの左から行列をかけることになるのですが、その行列の行列式(determinant)の値だけ、 ベクトルが作り出す平行四辺形の面積が大きくなるという特徴があります。

では、このような行列をかけてみると、どのようになるでしょうか。

\begin{equation}
\begin{split}
A = 
\begin{pmatrix}
2 & 1 \\
2 & 3
\end{pmatrix}
\end{split}
\end{equation}
\mathrm{det} A = \begin{vmatrix}
2& 1 \\
2 & 3 
\end{vmatrix} = 2 \times 3   - 1 \times 2 = 4

行列式の値が4になりました。このような行列$A$をかけた場合、平行四辺形の面積は4倍になります。

最初に提示したコード中の$A$の値を(1)に変更して図示すると、次のようになります。

最初の正方形が、右の平行四辺形に変わりました。

【広告】
統計学的にあなたの悩みを解決します。
仕事やプライベートでお悩みの方は、ベテラン占い師 蓮若菜にご相談ください。

機械学習と情報技術