Matrix

Matrix


행렬(matrix)

  • 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열이다.
In [1]:
import numpy as np
X= np.array([[1,-2,3],[7,-5,0],[-2,-1,2]])
X
Out[1]:
array([[ 1, -2,  3],
       [ 7, -5,  0],
       [-2, -1,  2]])

image.png


image.png

  • 행렬은 행(row)열(column)이라는 인덱스(index)를 가진다.


image.png

  • 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부른다.


전치행렬

image.png


행렬 이해하기 #1

image.png

  • 행렬의 행벡터 Xii번쨰 데이터를 의미한다.


image.png

  • 행렬의 xiji번째 데이터의 j번째 변수의 값을 말한다.


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

  • 행렬끼리 같은 모양을 가지면 덧셈,뺄셈을 계산할 수 있다.
  • 성분곱, 스칼라곱은 벡터와 차이가 없다.

image.png



행렬 곱셈

image.png

  • 행렬 곱셈(matrix multiplication)은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • 행렬곱은 X의 열의 개수와 Y의 행의 개수가 같아야 한다.

코드로 확인해 보기

In [2]:
X= np.array([[1,-2,3],
             [7,-5,0],
             [-2,-1,2]])
Y=np.array([[0,1],
            [1,-1],
            [-2,1]])
In [3]:
X@Y
Out[3]:
array([[-8,  6],
       [-5, 12],
       [-5,  1]])
  • numpy에서는 @연산이 행렬의 곱셈이다.



행렬의 내적

image.png

  • 넘파이의 np.inneri번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • 수학에서는 보통 tr(XYT)

코드에서 확인해 보기

In [4]:
X= np.array([[1,-2,3],
             [7,-5,0],
             [-2,-1,2]])
Y=np.array([[0,1,-1],
            [1,-1,0]])
In [5]:
np.inner(X,Y)
Out[5]:
array([[-5,  3],
       [-5, 12],
       [-3, -1]])
  • X의 열의 개수와 Y의 열의 개수가 같아야 한다.


행렬 이해하기 #2

image.png

  • 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다
  • 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있다.
  • 행렬곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수도 있다.



역행렬

  • 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부르고 A-1라 표기한다.
  • 역행렬은 행과 열 숫자가 같고 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있다.

image.png

  • 역행렬 연산은 n=m 일때만 가능하고 행렬A의 행렬식이 0이 되면 안된다.

코드로 확인해 보기

In [6]:
X= np.array([[1,-2,3],
             [7,-5,0],
             [-2,-1,2]])
In [7]:
np.linalg.inv(X)
Out[7]:
array([[ 0.3030303 , -0.03030303, -0.45454545],
       [ 0.42424242, -0.24242424, -0.63636364],
       [ 0.51515152, -0.15151515, -0.27272727]])
  • 역행렬 구하기
In [8]:
X @ np.linalg.inv(X)
Out[8]:
array([[ 1.00000000e+00, -5.55111512e-17, -1.11022302e-16],
       [ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00],
       [-2.22044605e-16,  0.00000000e+00,  1.00000000e+00]])
  • 결과는 항등행렬이어야 하지만 0인 부분은 완전히 0값이 나오지 않고 0에 근접한 값이 나오게 된다.


유사역행렬/무어-펜로즈 역행렬

  • 만일 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse)또는 무어-펜로즈(Moore_Penrose)역행렬 A+을 이용한다.

image.png

코드로 확인해 보기

In [9]:
Y=np.array([[0,1],
           [1,-1],
           [2,1]])
In [10]:
np.linalg.pinv(Y)
Out[10]:
array([[-0.07142857,  0.28571429,  0.35714286],
       [ 0.35714286, -0.42857143,  0.21428571]])
  • 유사 역행렬
In [11]:
np.linalg.pinv(Y) @Y
Out[11]:
array([[ 1.00000000e+00,  1.11022302e-16],
       [-1.11022302e-16,  1.00000000e+00]])
  • 항등 행렬
In [12]:
X=np.array([[1,0,1],
           [0,1,0]])
In [13]:
np.linalg.pinv(X)
Out[13]:
array([[0.5, 0. ],
       [0. , 1. ],
       [0.5, 0. ]])

'AI > 이론' 카테고리의 다른 글

Pandas II  (0) 2021.01.27
Pandas I  (0) 2021.01.27
경사하강법 II  (0) 2021.01.26
경사하강법 I  (0) 2021.01.26
벡터  (0) 2021.01.25
Numpy part III  (0) 2021.01.25
Numpy part II  (0) 2021.01.25
Numpy part I  (0) 2021.01.25

+ Recent posts