人工知能数学第5週


課題目標
Python numpyパッケージを用い,1)座標系変換と2)標準マトリクスを用いて線形変換を実行するコードを記述する.
import numpy as np
import numpy.linalg
1)座標系変換
3-ベクトルvmathbf{v}vは、標準座標系で次のように表される.
v=[344]\mathbf{v} =\left[\begin{array}{rrr} 3\\4\\4\end{array}\right]v=⎣⎢⎡​344​⎦⎥⎤​
以下の2つのベクトルv 1mathbf{v}1 v 1とv 2mathbf{v}2 v 2をベースベクトルの新しい座標系として導入すると、3−ベクトルvmathbf{v}vの座標値が求められる.
v1=[131],v=[1−22]\mathbf{v}_1 =\left[\begin{array}{rrr} 1\\3\\1\end{array}\right],\quad\mathbf{v} =\left[\begin{array}{rrr} 1\\-2\\2\end{array}\right]v1​=⎣⎢⎡​131​⎦⎥⎤​,v=⎣⎢⎡​1−22​⎦⎥⎤​
この問題を解決するnumpyコードを作成してください.
問題の定義
この問題は以下の式を満たすx 1 x 1 x 1,x 2 x 2 x 2を求めることによって解決される.
x1[131]+x2[1−22]=3[100]+4[010]+4[001]=[344]x_1\left[\begin{array}{rrr} 1\\3\\1\end{array}\right] + x_2\left[\begin{array}{rrr} 1\\-2\\2\end{array}\right] = 3\left[\begin{array}{rrr} 1\\0\\0\end{array}\right] + 4\left[\begin{array}{rrr} 0\\1\\0\end{array}\right] + 4\left[\begin{array}{rrr} 0\\0\\1\end{array}\right] =\left[\begin{array}{rrr} 3\\4\\4\end{array}\right]x1​⎣⎢⎡​131​⎦⎥⎤​+x2​⎣⎢⎡​1−22​⎦⎥⎤​=3⎣⎢⎡​100​⎦⎥⎤​+4⎣⎢⎡​010​⎦⎥⎤​+4⎣⎢⎡​001​⎦⎥⎤​=⎣⎢⎡​344​⎦⎥⎤​
すなわち、新しい座標系の座標値は(x 1,x 2)(x 1,x 2)(x 1,x 2)である.
この問題は、次のように線形システムとして表示されます.
[∣∣v1v2∣∣][x1x2]=[∣v∣]\left[\begin{array}{cc} | & |\\\mathbf{v}_1 &\mathbf{v}_2\\| & |\end{array}\right]\left[\begin{array}{rr} x_1\\x_2\end{array}\right] =\left[\begin{array}{c} |\\\mathbf{v}\\|\end{array}\right]⎣⎢⎡​∣v1​∣​∣v2​∣​⎦⎥⎤​[x1​x2​​]=⎣⎢⎡​∣v∣​⎦⎥⎤​
ベクトルと行列の定義
3−ベクトルvmathbf{v}vおよびv 1mathbf{v}1 v 1、v 2mathbf{v}2 v 2をベースベクトルとする座標系3 x 2行列AAAを定義する.
このとき、numpy.column_stackを用いて、v 1mathbf{v}1 v 1、v 2mathbf{v}2 v 2を順に行列AAAの列(column)に配置する.
v  = np.array((3,4,4))

v1 = np.array((1,3,1))
v2 = np.array((1,-2,2))

A = np.column_stack((v1, v2))

print(A)
print(v)
線形システムの定義と解
Ax=vA\mathbf{x} =\mathbf{v}Ax=v
この問題の行列AAAは正方形行列ではなく,大きさは3 x 2である.この場合,最小二乗法を用いて最適化を行い,線形系を解くことができる.[参考資料:リンク]
(*最小二乗法に関する理論は後述する.)
x = np.linalg.lstsq(A, v, rcond=None)[0]

print(x)
2)標準マトリックスによる線形変換
2 Dベクトルを入力として受け入れ、このベクトルを反時計回りに60circ 60回転させる機能を実現します.
問題の定義
我々が要求する変換は,2次元入力(x∈R 2mathbf{x}inmathbb{R}^2 x∈R 2)を受け入れ,2次元出力(xl∈R 2mathbf{x}linmathbb{R}^2 xl∈R 2)の線形変換(linear transformation)を生成することである.
従って、この機能(関数)は、2 x 2マトリクスAAAで実現することができる.
2 x 2マトリクスAAAの第1列(列)は、以下のように構成することができる.
  • 二次元空間を計算する最初の基底(ベース)ベクトル(1,0)がこの機能によってどこに変換され、v 1mathbf{v}1 v 1に設定されるか.
  • 二次元空間の2番目の基底(ベース)ベクトル(0,1)がこの機能によってどこに変化するかを計算し,v 2mathbf{v}2 v 2に設定した.
  • 2 x 2マトリクスAAAのnumpyコードを記述し、以下に示す.
    A=[∣∣v1v2∣∣]A =\left[\begin{array}{cc} | & |\\\mathbf{v}_1 &\mathbf{v}_2\\| & |\end{array}\right]A=⎣⎢⎡​∣v1​∣​∣v2​∣​⎦⎥⎤​
    v1 = np.array((1, 0))
    v2 = np.array((0, 1))
    
    A = np.column_stack((v1, v2))
    
    print(A)
    線形変換の実行
    以下の2−ベクトルをそれぞれ入力として線形変換を行うコードを記述する.
    x1=[10],x2=[3−2]\mathbf{x}_1 =\left[\begin{array}{rrr} 1\\0\end{array}\right],\quad\mathbf{x}_2 =\left[\begin{array}{rrr} 3\\-2\end{array}\right]x1​=[10​],x2​=[3−2​]
    x1 = np.array((1, 0))
    x2 = np.array((3, -2))
    
    y1 = np.linalg.lstsq(A, x1, rcond=None)[0]
    y2 = np.linalg.lstsq(A, x2, rcond=None)[0]
    
    print(y1)
    print(y2)