관리 메뉴

공부 기록

[WEEK 1] AI Math - 행렬 본문

BOOST CAMP - AI Tech

[WEEK 1] AI Math - 행렬

_JAEJAE_ 2022. 9. 25. 00:05

▶ 행렬

  • 벡터를 원소로 가지는 2차원 배열이다.
  • $X = \begin{bmatrix}1&-2&3\\7&5&0\\-2&-1&2\end{bmatrix}$
x = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])
  • 행백터를 원소로 가지는 2차원 배열로 이해하면 쉽다.
  • $X = (x_{ij})$ 
  • 행(row)과 열(column)이라는 인덱스를 가진다. 

 

  • 전치행렬 (transpose matrix)
    • $X^T=(x_{ji})$
    • 행과 열의 인덱스의 순서를 바꾼 행렬이다.
    • NXM 행렬의 전치행렬은 MXN 행렬이 된다.
    • 벡터에서도 성립된다.

 

▶ 행렬을 이해하는 방법(1)

  • 행렬은 공간에서 여러 점들을 나타낸다.
  • 데이터들의 모임이다.
  • 행벡터 $\mathbf x_i$는 i번째 데이터를 의미한다.
  • 행렬의 $x_{ij}$는 i 번째 데이터의 j 번째 변수의 값을 의미한다.

 

▶ 행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱

  • 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있다.
  • 각 행렬의 구성 성분의 덧셈, 뺄셈으로 계산할 수 있다.
  • 성분곱과 스칼라곱도 벡터와 같다. 

 

▶ 행렬 곱셈

  • $XY=\begin{pmatrix}\sum_kx_{ik}y_{kj}\end{pmatrix}$
  • i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • 행렬의 곱셈은 숫자의 곱셈과 달리 순서에 따라 계산결과가 달라진다.
  • X의 열의 개수와 Y의 행의 개수가 같아야 연산이 가능하다.
import numpy as np

X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0, 1],
              [1, -1],
              [-2, 1]])

X @ Y

# array([[-8,  6],
#        [ 5,  2],
#        [-5,  1]])

 

행렬 내적

  • $XY^T=\begin{pmatrix}\sum_kx_{ik}y_{jk}\end{pmatrix}$
  • np.inner는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • np.inner와 수학에서의 내적은 개념이 다르다.
  • 수학에서는 보통 $tr(XY^T)$을 내적으로 계산한다.
import numpy as np

X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0, 1, -1],
              [1, -1, 0]])

np.inner(X, Y)

# array([[-5,  3],
#        [ 5,  2],
#        [-3, -1]])
  • 행렬곱에서는 X의 열의 갯수와 Y의 행의 갯수가 같아야 한다.
  • np.inner에서는 X의 행의 갯수와 Y의 행의 갯수가 같아야 한다.

 

▶ 행렬을 이해하는 방법 2

  • $\mathbf Z=A\mathbf X$
  • $z_i=\sum_ja_{ij}x_j$
  • 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다.
  • 행렬을 통해 두 벡터를 연결지을 수 있다.
  • 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있다.
    • ex. m차원 공간 상에 존재하는 벡터를 n차원 공간으로 보냄

  • 행렬곱을 통해 주어진 데이터에서 패턴을 추출할 수 있고, 데이터를 압축할 수 있다.
  • 모든 선형변환 (linear transform)은 행렬곱으로 계산할 수 있다.

 

▶ 역행렬

  • $A^{-1}$
  • 행렬 $A$의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라고 한다. 
  • $AA^{-1}=A^{-1}A=I$
  • 행과 열의 갯수가 같고 행렬식(determinant)이 0이 아닌 경우만 계산할 수 있다.

import numpy as np

X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

np.linalg.inv(X) # 역행렬

# array([[ 0.21276596,  0.0212766 , -0.31914894],
#       [-0.29787234,  0.17021277,  0.44680851],
#       [ 0.06382979,  0.10638298,  0.40425532]])

X @ np.linalg.inv(X) # I

# array([[ 1.00000000e+00,  0.00000000e+00,  0.00000000e+00],
#       [ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00],
#       [-5.55111512e-17,  0.00000000e+00,  1.00000000e+00]])

 

▶ 유사역행렬(무어-펜로즈 역행렬)

  • $A^+$
  • 역행렬을 계산할 수 없을 때 대신 사용되는 개념이다.
  • 행과 열의 갯수가 달라도 계산할 수 있다.
  • $n\ge m$ 인 경우
    • $A^+=(A^TA)^{-1}A^T$
    • $A^+A=I$ (순서 중요!)
  • $n\le m$ 인 경우
    • $A^+=A^T(AA^T)^{-1}$
    • $AA^+=I$ (순서 중요!)

 

import numpy as np

Y = np.array([[0, 1], 
              [1, -1],
              [-2, 1]])

np.linalg.pinv(Y)

# array([[ 5.00000000e-01,  1.11022302e-16, -5.00000000e-01],
#        [ 8.33333333e-01, -3.33333333e-01, -1.66666667e-01]])

np.linalg.pinv(Y) @ Y

# array([[ 1.00000000e+00, -2.22044605e-16],
#        [ 1.11022302e-16,  1.00000000e+00]])

 

응용 1 : 연립방정식

  • np.linalg.pinv를 이용하면 연립방정식의 해를 구할 수 있다.
  • $n \le m$ 인 경우 : 식이 변수 개수보다 작거나 같아야 한다.
  • $A\mathbf x=\mathbf b$
  • $\mathbf x=A^+\mathbf b=A^T(AA^T)^{-1}\mathbf b$

 

▶ 응용 2 : 선형 회귀 분석

  • np.linalg.pinv를 이용하면 데이터를 선형 모델로 해석하는 선형회귀식을 찾을 수 있다.
  • $n\ge m$ 인 경우 : 데이터가 변수 개수보다 많거나 같아야 한다.
  • 선형회귀분석은 연립방정식과 달리 행이 더 크므로 방정식을 푸는 건 불가능하고 주어진 데이터를 가장 잘 표현할 수 있는 선을 찾는 것이 최선이다.
  • $X\beta=\mathbf {\hat y}\approx\mathbf y$
  • $\beta = X^+\mathbf y=(X^TX)^{-1}X^T\mathbf y$ (L2-노름을 최소화하는 계수 $\beta$)
  • sklearn의 LinearRegression과 같은 결과를 가져올 수 있다. 

 

※ 모든 시각 자료는 부스트 캠프 AI Tech 교육 자료를 참고했습니다.

'BOOST CAMP - AI Tech' 카테고리의 다른 글

[WEEK 1] AI Math - 딥러닝 학습 방법  (0) 2022.09.25
[WEEK 1] AI Math - 경사하강법  (0) 2022.09.25
[WEEK 1] AI Math - 벡터  (0) 2022.09.25
[WEEK 1] Object-Oriented Programming  (0) 2022.09.23
[WEEK 1] Pythonic code  (2) 2022.09.23
Comments