人工知能数学15週目


問題1)
以下の4×4行列AAAに対して質問に答える.
(a)AAAを求める逆行列A,1 A^{-1}A,1を求めるコードを書き出します.
ΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓ
# (a)  𝐴 의 역행렬  𝐴−1 을 구하는 코드를 작성하시오.
import numpy as np

arr = np.array(([1, -1, 1, 1], [-1, 2, 1, -1], [2, 0, 7, -1], [1, -2, -3, 2]))
print(arr)
arr_inv = np.linalg.inv(arr)

print(arr_inv)

#[[ 1 -1  1  1]
# [-1  2  1 -1]
# [ 2  0  7 -1]
# [ 1 -2 -3  2]]
#[[-2.   1.   1.   2. ]
# [-0.6  1.4  0.4  1.2]
# [ 0.8 -0.2 -0.2 -0.6]
# [ 1.6  0.6 -0.4 -0.2]]
# (b)  𝐴𝐱=⎡⎣⎢⎢⎢⎢1−11−1⎤⎦⎥⎥⎥⎥ 를 만족하는 벡터  𝐱 를 구하는 코드를 작성하시오.
b = np.array([1, -1, 1, -1])
x = arr_inv @ b

print(x)

#[-4.  -2.8  1.4  0.8]
問題2)
次の×55\times 55×五行列AAAに対して質問に答える.
(a)行列AAAのLDUDU分解を求める.
(b)LDUDU−分解結果を用いてAxi=biamathbf{x}{i}=mathbf{b}axi=biのximathbf{x}i}xiをそれぞれ求めた(ただし、i=1、2、3 i=1、2、3 i=1、3 i=1、3 i=1、3 i=1、2、3 i=1、2、3 i=1、2、3 i=3).
# (a) 행렬  𝐴 의  𝐿𝐷𝑈 -분해를 구하라.
import scipy.linalg as la

A = np.array(([1, 2, -3, 2, -1], [2, 6, -2, 0, 0], [0, 0, -1, -2, 1], [1, 0, -8, 5, -1], [2, 4, -8, 3, 5]))
(P, L, U) = la.lu(A)
D = np.diag(np.diag(U))   
U /= np.diag(U)[:, None] 
P.dot(L.dot(D.dot(U)))

#array([[ 1.,  2., -3.,  2., -1.],
#       [ 2.,  6., -2.,  0.,  0.],
#       [ 0.,  0., -1., -2.,  1.],
#       [ 1.,  0., -8.,  5., -1.],
#       [ 2.,  4., -8.,  3.,  5.]])
#(b)  𝐿𝐷𝑈 -분해 결과를 이용하여  𝐴𝐱𝑖=𝐛𝑖 의 해  𝐱𝑖 를 각각 구하라 (단,  𝑖=1,2,3 ).
b1 = np.array([24, 66, -41, 8, 9])
b2 = np.array([7, 18, -17, 1, 6])
b3 = np.array([21, 46, -78, 10, 42])

lu, piv = la.lu_factor(A)
x1 = la.lu_solve((lu, piv), b1)
print(x1)
x2 = la.lu_solve((lu, piv), b2)
print(x2)
x3 = la.lu_solve((lu, piv), b3)
print(x3)

#[-1857.   572.  -174.    86.   -43.]
#[-463.   143.5  -41.5   24.5   -9.5]
#[-1712.    528.5  -149.5    99.5   -28.5]
問題3)
線形系Ax=bAmathbf{x}=mathbf{b}Ax=bに関する質問に答えてください.
(a)numpyコードを記述し、行列AAAが直交行列であるか否かを決定する.
(b)行列AAAが直交行列であることを利用して,所与の線形系解xmathbf{x}xを求めるnumpy符号を書き出す.
# (a) 행렬  𝐴 가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.
bb = np.dot(A, x)
print(bb)

if np.allclose(b, bb):
  print("Ok")
else:
  print("something wrong")

#[-33.  -5.  19.  -5.  -9.   7.  11.   9.   5.  11. -23.  13.]
#Ok
# (a) 행렬  𝐴 가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.
import numpy.linalg
A = np.array(([1,1,1,1,1,1,1,1,1,1,1,1], [-1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1], [-1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1], [-1, 1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1]
             , [-1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, -1], [-1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1], [-1, -1, -1, -1, 1, -1, 1, 1, -1,1,1,1], [-1,1,-1,-1,-1,1,-1,1,1,-1,1,1]
             , [1,1,1,-1,-1,-1,1,-1,1,1,-1,1],[-1,1,1,1,-1,-1,-1,1,-1,1,1,-1], [-1,-1,1,1,1,-1,-1,-1,1,-1,1,1], [-1,1,-1,1,1,1,-1,-1,-1,1,-1,1]))
b = np.array(([-33, -5, 19, -5, -9, 7,11,9,5,11,-23,13]))
x = np.linalg.lstsq(A, b, rcond=None)[0]
print("x:", x)
print(np.shape(x))

#x: [-6.6         0.26666667 -4.73333333 -2.93333333 -9.6        -0.93333333
#  0.93333333 -0.6        -7.06666667  1.93333333 -4.93333333  1.26666667]
#(12,)
問題4)
4つの点(すなわち3,3)(すなわち3,3)(すなわち2,3)(すなわち2,3)(すなわち2,3)(すなわち1,2)(すなわち1,2)(すなわち0,0)(0,0)(0,0)(近似)の直線方程式y=mx+cy=mx+cがあり、最小二乗法(最小二乗法)で導出される)がある場合、5つのコードが得られる.
A = np.array(([-3,3], [-2,3], [-1,2], [0,0]))
b = np.array((1,2,3,4))

x_opt = np.linalg.lstsq(A, b, rcond=None)[0]
print(x_opt)

#[1.84210526 2.10526316]