人工知能数学6週目


課題目標
Python numpyパッケージを用いてコードを記述し,所与のマトリクスの2次元分解を求める.
参考資料:リンク
行列AAAの定義
numpyコードを記述して、以下の3 x 3マトリクスAAAを定義してください.
A=[3111−2−1111]A =\left[\begin{array}{rrr} 3 & 1 & 1\\1 & -2 & -1\\1 & 1 & 1\end{array}\right]A=⎣⎢⎡​311​1−21​1−11​⎦⎥⎤​
import numpy as np
import numpy.linalg 

# 행렬 코딩
A = np.array(([3,1,1,1], [1,-2,1,1], [1,-1,1,1], [1,-1,1,1]))

print(A)
print(np.shape(A))
マトリックスAAAの二次元分解計算
先に定義した行列AAAについて、LU分解、A=QRA=QRA=2次元を実行するnumpyコードを記述します.
# QR 분해
Q, R = np.linalg.qr(A)

print("Q:", Q)
print("R:", R)

## QR 분해 결과 체크: 연산결과가 A와 동일한지 체크
AA = np.dot(Q, R)
print("AA:", AA)
ベクトルの定義
numpyコードを記述して、以下の3ベクトルbmathbf{b}bを定義してください.
b=[412]\mathbf{b} =\left[\begin{array}{rrr} 4\\1\\2\end{array}\right]b=⎣⎢⎡​412​⎦⎥⎤​
# 벡터 코딩
b = np.array((4,1,2))

print(b)
print(np.shape(b))
2 D分解を使用して線形系Ax=bAmathbf{x}=mathbf{b}Ax=bを解放
行列AAAの2次元分解を用いて,Ax=bAMathbf{x}=Mathbf{b}Ax=bを計算するnumpyコードを記述する.
Ax=bAmathbf{x}=mathbf{b}Ax=bをQRx=bQRmathbf{x}=mathbf{b}QRx=bと見なし、以下の問題を解決する.
  • Rx=yRmathbf{x}=mathbf{y}はRx=y,Qy=bqmathbf{y}=mathbf{y}=mathbf{y=b解答ymathbf{y}yに設定されている.
  • Rx=yRmathbf{x}=mathbf{y}Rx=y問題、xmathbf{x}xを得る.
  • 解放線形系Qy=bqmathbf{y}=mathbf{b}Qy=b
    Qは直交行列(直交行列)であるため,Qの逆行列は前置行列QTQ^{T}QTと同じである.
    これらの性質を利用して,ymathbf{y}yを解くnumpyコードを記述する.
    # Qy = b 풀기
    
    y = np.linalg.lstsq(Q, b, rcond=None)[0]
    print("y:", y)
    print(np.shape(y))
    解線形系Rx=yRmathbf{x}=mathbf{y}Rx=y
    RRRは、逆行列が存在する上三角行列(上三角行列)である.
    これらの性質を利用して,xmathbf{x}xを求めるnumpyコードを記述する.
    # Rx = y 풀기
    
    x = np.linalg.lstsq(R, y, rcond=None)[0]
    
    print("x:", x)
    print(np.shape(x))
    線形システムを決定する年
    コード検証を記述する前に2次元分解を用いて求めたxmathbf{x}xが線形系Ax=bAmathbf{x}=mathbf{b}Ax=bの解であるか否かを検証する.
    ## 결과 검증
    
    bb = np.dot(A, x)
    print(bb)
    
    if np.allclose(b, bb):
      print("Ok")
    else:
      print("something wrong")