Search

선형대수 기초 with python NumPy

Created at
2018/11/16
Updated at
Tags
Keywords
선형대수
3 more properties
선형대수의 기초 개념과 파이썬 numpy로 구현해보는 내용을 정리해보았다.

데이터의 유형

1) 스칼라(scalar)

실수인 숫자 하나로 이루어진 데이터

2) 벡터(vector)

여러 개의 숫자가 특정한 순서대로 모여있는 것
import numpy as np x = np.array([[1], [3], [2], [4]]) x
Python
복사
array([[1], [3], [2], [4]])

3) 행렬(matrix)

벡터들의 모임, 2D array of numbers
A = np.array([[11, 12, 13], [21, 22, 23]]) A
Python
복사
array([[11, 12, 13], [21, 22, 23]])

전치연산(transpose)

행렬의 행과 열을 바꾸는 연산
벡터나 행렬에 $T$라는 위첨자(super-script)를 붙여서 표기
# T는 method가 아닌 attribute이므로 소괄호()를 붙여서 호출하지 않는다. A.T
Python
복사
array([[11, 21], [12, 22], [13, 23]])

특수한 벡터와 행렬

1) 영벡터

모든 원소가 0인 N차원 벡터

2) 일벡터

모든 원소가 1인 N차원 벡터

3) 정방 행렬(square matrix)

행의 개수와 열의 개수가 같은 행렬

4) 대각 행렬(diagonal matrix)

모든 비대각(off-diagonal) 요소가 0인 정방 행렬
numpy에서는 diag 명령을 사용
np.diag([1, 2, 3])
Python
복사
array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])

5) 단위 행렬(identity matrix)

모든 대각 성분의 값이 1인 대각 행렬
numpy에서는 identity, 혹은 eye 명령을 사용
np.identity(3)
Python
복사
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
np.eye(4)
Python
복사
array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])

6) 대칭 행렬(symmetric matrix)

정방 행렬 중 전치 행렬과 원래의 행렬이 같은 행렬
ST=SS^T = S

벡터와 행렬의 연산

1) 벡터와 행렬의 덧셈과 뺄셈

같은 크기의 벡터와 행렬에서 계산이 가능하며, 같은 위치의 원소끼리(element-wise) 더하거나 뺌
x1 = np.array([1, 2, 3, 4, 5]) x2 = np.array([6, 7, 8, 9, 10])
Python
복사
x1 + x2
Python
복사
array([ 7, 9, 11, 13, 15])
x2 - x1
Python
복사
array([5, 5, 5, 5, 5])

2) 스칼라와 벡터/행렬의 곱셈

벡터(xx)나 행렬(AA)의 모든 원소에 스칼라(cc)를 곱하는 것과 같음 (스칼라배)
c[x1x2]=[cx1cx2]c[a11a12a21a22]=[ca11ca12ca21ca22]\begin{aligned} c \begin{bmatrix} x_1 \\x_2 \end{bmatrix} & = \begin{bmatrix} cx_1 \\cx_2 \end{bmatrix} \\ c \begin{bmatrix} a_{11} & a_{12}\\a_{21} & a_{22} \end{bmatrix} & = \begin{bmatrix} ca_{11} & ca_{12}\\ca_{21} & ca_{22} \end{bmatrix} \end{aligned}

3) 선형 조합(linear combination)

벡터/행렬을 스칼라배한 후 더하거나 뺀 것으로, 벡터나 행렬을 선형조합해도 그 크기는 변하지 않음
c1x1+c2x2++cLxL=xc1A1+c2A2++cLAL=x\begin{aligned} c_1x_1 + c_2x_2 + \cdots + c_Lx_L = x \\ c_1A_1 + c_2A_2 + \cdots + c_LA_L = x \end{aligned}

4) 벡터와 벡터의 곱셈

내적(inner product, dot product)
xTyx^Ty 혹은 xyx \cdot y
앞을 행벡터, 뒤를 열벡터로 두고 같은 위치의 원소들을 각각 곱해 모두 더해 스칼라 값으로 만듦
xTy=[x1x2xN][y1y2yN]=x1y1++xNyN=i=1Nxiyix^Ty = \begin{bmatrix}x_1 & x_2 & \cdots& x_N \end{bmatrix}\begin{bmatrix}y_1 \\ y_2 \\ \vdots \\ y_N \end{bmatrix} = x_1y_1 + \cdots + x_Ny_N = \sum_{i=1}^N x_iy_i
가중합(weighted sum)을 벡터와 벡터의 곱셈으로 계산할 수 있음
w1x1++wNxN=i=1Nwixi=wTxw_1x_1 + \cdots + w_Nx_N = \sum_{i=1}^N w_ix_i = w^Tx
벡터의 내적은 두 벡터간의 유사도(similarity)를 계산하는 데에도 이용 (유사할수록 내적이 커짐)

5) 행렬과 행렬의 곱셈

행렬 AABB의 곱을 행렬 CC라고 할 때, cijc_{ij}의 값은 A행렬의 i번째 행벡터 aiTa_i^TBB행렬의 jj번째 열벡터 bjb_j의 내적
C=ABcij=aiTbjC = AB \to c_{ij} = a_i^Tb_j
numpy를 활용한 행렬의 내적 계산
A = np.array([[1, 2, 3], [4, 5, 6]]) B = np.array([[1, 2], [3, 4], [5, 6]])
Python
복사
A
Python
복사
array([[1, 2, 3], [4, 5, 6]])
B
Python
복사
array([[1, 2], [3, 4], [5, 6]])
C = np.dot(A, B) C
Python
복사
array([[22, 28], [49, 64]])

6) 행렬의 계산 법칙

행렬의 곱셈은 교환법칙이 성립하지 않음
ABBAAB \neq BA
행렬의 덧셈에 대한 분배 법칙은 성립함
A(B+C)=AB+AC(A+B)C=AC+BCA(B+C) = AB + AC \\ (A+B)C = AC + BC
전치 연산도 덧셈/뺄셈에 대해 분배 법칙이 성립
(A+B)T=AT+BT(A + B)^T = A^T + B^T
전체 연산의 곱셈의 경우 분배법칙이 성립하지만 전치 연산이 분배되면서 곱셈의 순서가 바뀜
(AB)T=BTAT(ABC)T=CTBTAT\begin{aligned}(AB)^T & = B^TA^T \\ (ABC)^T & = C^TB^TA^T \end{aligned}
연속된 행렬의 곱셈은 계산 순서를 임의로 해도 상관 없음
ABC=(AB)C=A(BC)ABCD=((AB)C)D=(AB)(CD)=A(BCD)=A(BC)DABC = (AB)C = A(BC) \\ ABCD = ((AB)C)D = (AB)(CD) = A(BCD) = A(BC)D
어떤 정방 행렬이든 단위 행렬을 곱하면 그 행렬의 값이 변하지 않음
AI=IA=AAI = IA = A

참고자료