「線形変換」について

線形代数の基礎
No.174
数学

日付:2025年2月17日

線形変換の基本概念、数学的な定義、行列を用いた表現、応用例について解説します。

目 次

はじめに

数学やデータサイエンスの分野で重要な概念の一つに 線形変換(Linear Transformation) があります。
線形変換は、座標系の回転、拡大・縮小、シアー変換(せん断)などの操作を表現するために使用されます。

線形変換の考え方は、画像処理、コンピュータグラフィックス(CG)、機械学習、物理シミュレーションなど、多くの応用分野で重要です。
例えば、画像のリサイズや回転、3D グラフィックスのオブジェクトの移動やスケール調整、ニューラルネットワークにおける重み行列の適用なども線形変換の一種です。

本記事では、線形変換の基本概念、数学的な定義、行列を用いた表現、計算方法、具体例について詳しく解説し、Python を使った可視化を通じて、直感的に理解できるようにします。

1. 線形変換とは?

線形変換とは、あるベクトル空間の要素(ベクトル)を別のベクトル空間の要素に 線形性を保ったまま変換する関数 です。
数学的には、以下の 2 つの条件を満たす関数 TT を線形変換と呼びます。

  1. 加法性(Additivity) T(u+v)=T(u)+T(v)T(\mathbf{u} + \mathbf{v}) = T(\mathbf{u}) + T(\mathbf{v})
  2. スカラー倍に対する閉性(Homogeneity) T(cu)=cT(u)T(c \mathbf{u}) = c T(\mathbf{u})

ここで、u,v\mathbf{u}, \mathbf{v} はベクトル、cc はスカラー(実数)です。

この 2 つの性質により、線形変換は行列を使って簡潔に表現できるため、計算がしやすくなります。

2. 具体例:2 次元平面の変換

線形変換は 行列とベクトルの積 として計算されます。以下では、2 次元平面での変換を具体的に見ていきます。

(1) 2D 回転変換の例

例えば、2D ベクトル x=[xy]\mathbf{x} = \begin{bmatrix} x \\ y \end{bmatrix} に回転行列を適用 する場合を考えます。

A=[cosθsinθsinθcosθ]A = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}

この行列をベクトルにかけると、次のような計算になります。

[xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

計算の展開:

x=xcosθysinθx' = x \cos\theta - y \sin\theta y=xsinθ+ycosθy' = x \sin\theta + y \cos\theta

このように、各成分の計算は行列の各行とベクトルのドット積(内積)として計算されます。

(2) 拡大・縮小(Scaling)

ベクトルの長さを変更する変換で、行列 AA は次のようになります。

A=[sx00sy]A = \begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix}

sx,sys_x, s_y が拡大・縮小の倍率を表します。

(3) シアー変換(Shear)

ベクトルを 平行四辺形状に歪ませる 変換。

A=[1k01]A = \begin{bmatrix} 1 & k \\ 0 & 1 \end{bmatrix}

ここで、kk はせん断係数です。

3. Python を用いた可視化

以下の Python コードを使用して、元のベクトルと線形変換後のベクトルの変化を視覚化することができます。

PYTHON
import numpy as np import matplotlib.pyplot as plt # 元のベクトルを定義(複数のベクトル) vectors = np.array([ [1, 2], # (1,2) のベクトル [3, 1], # (3,1) のベクトル [-1, -2], # (-1,-2) のベクトル [-2, 1] # (-2,1) のベクトル ]) # 変換行列の定義(回転 + 拡大縮小) theta = np.pi / 6 # 30 度の回転(ラジアン単位) scale_x, scale_y = 1.5, 0.8 # X 軸方向に 1.5 倍、Y 軸方向に 0.8 倍のスケーリング # 回転と拡大縮小を含む線形変換行列の作成 transformation_matrix = np.array([ [scale_x * np.cos(theta), -scale_x * np.sin(theta)], # X 成分 [scale_y * np.sin(theta), scale_y * np.cos(theta)] # Y 成分 ]) # 線形変換の適用(行列積を計算) transformed_vectors = np.dot(vectors, transformation_matrix.T) # グラフの設定 fig, ax = plt.subplots(figsize=(6, 6)) # 図のサイズを 6x6 に設定 ax.axhline(0, color='black', linewidth=0.5) # X 軸を描画 ax.axvline(0, color='black', linewidth=0.5) # Y 軸を描画 ax.set_xlim(-4, 4) # X 軸の範囲 ax.set_ylim(-4, 4) # Y 軸の範囲 ax.grid(True, linestyle="--", linewidth=0.5) # グリッドを表示 # 元のベクトルをプロット(青色で表示) for v in vectors: ax.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='blue', alpha=0.6) # 変換後のベクトルをプロット(赤色で表示) for v in transformed_vectors: ax.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='red', alpha=0.8) # グラフのタイトルを設定 ax.set_title("Original vs Transformed Vectors") # グラフを表示 plt.show()
Original vs Transformed Vectors

グラフの説明

このコードには、線形変換(回転 + 拡大縮小)を適用するための詳細なコメントを追加しました。

  • 回転(30 度)スケーリング(X 軸 1.5 倍、Y 軸 0.8 倍) を組み合わせた変換を行っています。
  • 青いベクトルが元のベクトル、赤いベクトルが変換後のベクトル を表します。
  • ax.quiver() を用いて ベクトルを原点から描画 し、線形変換の影響を可視化しています。

4. まとめ

  • 線形変換とは、ベクトルを別のベクトルへ変換する操作であり、加法性とスカラー倍の性質を持つ。
  • 行列を用いて線形変換を表現できるため、計算が効率的に行える。
  • 回転、拡大、シアー変換、反射などの変換はすべて行列の積によって計算できる。
  • Python を用いることで、線形変換の効果を直感的に視覚化できる。
  • 線形変換は、コンピュータグラフィックス、機械学習、データサイエンス、物理シミュレーションなどの幅広い分野で応用される。

線形変換は数学的な概念として重要であり、現実世界の多くの技術に組み込まれています。