Linear algebra

3.532 Aufrufe

Veröffentlicht am

기초적인 Linear Algebra 와 Matrix Calculus 부터 Back-propagation 까지 유도하는 슬라이드입니다. 본 슬라이드에서는 NumPy 와 선형대수를 다룹니다.

Veröffentlicht in: Daten & Analysen
0 Kommentare
47 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
3.532
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
9
Aktionen
Geteilt
0
Downloads
197
Kommentare
0
Gefällt mir
47
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Linear algebra

  1. 1. Math Tutorial I Linear Algebra & Matrix Calculus 임성빈
  2. 2. Linear Algebra
  3. 3. 이튜토리얼은Python NumPy 라이브러리를사용합니다 import numpy as np import numpy.linalg as linalg
  4. 4. 벡터(Vector) x = (x , x , … , x ) 벡터는기하적인공간의단위원소를표현합니다 벡터는각 성분의데이터타입이같아야합니다 벡터는행벡터(row vector)와열벡터(column vector)로구분합니다 Note : 성분x 자리에벡터나행렬또는함수가 들어와도된다 1 2 d i
  5. 5. 배열(array) x = (x , x , … , x ) 벡터를표현하는가장간단한방법 수학자들은이걸 d 차원튜플(tuple)이라부릅니다 파이썬커뮤니티에선1차원배열이라부릅니다 x = np.array([x1, ... ,xd]) # 배열 x.shape # (d, ) 1 2 d
  6. 6. 행벡터(row vector) x = x = np.array([[x1, ... , xd]]) # 2차원 배열 x = np.matrix([[x1, ... ,xd]]) # (1,d) 행렬 x.shape [x , x , ⋯ , x1 2 d]
  7. 7. 열벡터(column vector) x = x = np.array([[x1], ... ,[xd]]) # 2차원 배열 x = np.matrix([[x1], ... ,[xd]]) # (d,1) 행렬 x.shape ⎣ ⎢ ⎢ ⎡x1 x2 ⋮ xd ⎦ ⎥ ⎥ ⎤
  8. 8. Note : NumPy 에서배열에np.matrix 를적용하면행벡터로변환합니다 u = np.array([x1, ... , xd]) # (d, ) 배열 v = np.matrix(u) # (d,1) 행렬 v == np.array([[x1, ... , xd]]) # True
  9. 9. 벡터연산(Operation of vectors) 덧셈& 뺄셈 v + u = (v + u , ⋯ , v + u ) v − u = (v − u , ⋯ , v − u ) v+u, v-u 1 1 d d 1 1 d d
  10. 10. 곱셈 스칼라곱 (Scalar product) αv = (αv , ⋯ , αv ) alpha * v 또는 np.multiply(alpha,v) 성분곱 Elementwise multiplication (Hadamard product) v ⊙ u = (v u , ⋯ , v u ) v * u 또는 np.multiply(v,u) 1 d 1 1 d d
  11. 11. 내적(Inner product) v ⋅ u = v u np.inner(v,u) i=1 ∑ d i i
  12. 12. 행렬(Matrix) X = = (x ) X 를(n × m) 행렬이라부릅니다 파이썬에선행렬을2차원배열로정의합니다 X = np.array([[x11,...,x1m],...,[xn1,...,xnm]]) X = np.matrix([[x11,...,x1m],...,[xn1,...,xnm]]) X.shape # (n,m) 행렬 ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡x11 x21 ⋮ xn1 ⋯ ⋯ xij ⋯ x1m x2m ⋮ xnm ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ij n×m
  13. 13. 행렬은각 성분이배열로이루어진배열로나타낼수있습니다 X = (x , ⋯ ,x ) = x_i = np.array([x_i1, ... , x_im]) # i = 1,...,n X = np.array([x_1, ... , x_n]) # (n,m) 행렬 Quiz : 각 성분이행렬로이루어진배열은무엇일까요? 1 n ⎣ ⎢ ⎢ ⎡x1 x2 ⋮ xn ⎦ ⎥ ⎥ ⎤
  14. 14. 텐서(Tensor) X = (x ) 텐서는수학에서벡터, 행렬을3차원이상으로일반화시킨개념 벡터는1차원텐서, 행렬은2차원텐서 텐서는각 성분이행렬로이루어진배열로나타낼수있습니다 XX = np.array([[[x111, .. , x11p], .. ,[x1m1, .. ,x1mp]], ... [[xn11, .. , xn1p], .. ,[xnm1, .. ,xnmp]]]) ijk (n×m×p)
  15. 15. 왜텐서를쓰죠? 대부분의시공간 데이터는3차원이상구조로표현됩니다 영상은2차원행렬× RGB 시계열데이터는시간축포함 d ≥ 3 이상인공간에서미적분학을기술할때유용합니다 텐서에익숙해지면Back propagation 계산이쉬워집니다! 유사품으로행렬미적분학(Matrix calculus) 을많이씁니다.
  16. 16. 텐서연산의예
  17. 17. 행렬연산 행렬의덧셈뺄셈은벡터와같습니다 X + Y = (x + y )ij ij (n×m
  18. 18. 행렬의곱셈은한가지를제외하고 벡터연산과 같습니다 스칼라곱 성분곱 내적
  19. 19. 행렬의곱셈은한가지를제외하고 벡터연산과 같습니다 스칼라곱 성분곱 행렬곱
  20. 20. 행렬곱 (Matrix multiplication) X : (n × m ) 행렬, Y : (m × m) 행렬 XY = x y = (x ⋅y ) X = np.random.normal(0,1,(n,p)) # (n,p)행렬 생성 Y = np.random.normal(0,1,(p,m)) # (p,m)행렬 생성 np.matmul(X,Y) # (n,m)행렬 np.matmul(Y,X) # 에러 ′ ′ ( k=1 ∑ m′ ik kj) (n×m) i j T
  21. 21. Transpose 행렬의각 성분들의행과 열을바꾸는걸 전치(Transpose)라합니다. X = (x ) →  X = (x ) 벡터도전치가 가능합니다 v = (v ) →  v = (v ) X = np.array([[x11,..,x1m],..,[xn1,..,xnm]]) # (n,m) 행렬 X_transpose = np.transpose(X) # (m,n) 행렬 X.T ij (n×m) T ji (m×n) i (d×1) T i 1×d
  22. 22. 몇가지알아둬야할것들 1. v, u 가 벡터인경우 v u =u v 2. X, Y 가 행렬인경우 (X ) = X (XY) =Y X (X + Y) =X +Y T T T T T T T T T T
  23. 23. NumPy 에서행렬연산시주의할점 u = np.array([[1,2,3],[4,5,6]]) # (2,3) 행렬 v = np.array([[1,0,0],[0,1,0]]) u*v # 성분곱 (2,3) 행렬 np.matmul(u.T, v) # 행렬곱 (3,3) 행렬 np.matmul(u, v.T) # 행렬곱 (2,2) 행렬 u = np.matrix([[1,2,3],[4,5,6]]) v = np.matrix([[1,0,0],[4,5,6]]) np.multiply(u,v) # 성분곱 (2,3) 행렬 u.T * v # 행렬곱 (3,3) 행렬 u * v.T # 행렬곱 (2,2) 행렬 u*v # 에러
  24. 24. 단위행렬과 역행렬 1. 단위행렬(Identity matrix) I = np.identity(n) # (n,n) 단위행렬 n ⎣ ⎢ ⎢ ⎡1 0 ⋮ 0 0 1 ⋮ 0 ⋯ ⋯ ⋮ ⋯ 0 0 ⋮ 1⎦ ⎥ ⎥ ⎤
  25. 25. 2. 역행렬(Inverse matrix) XY =I = YX 이때Y =X 이라쓴다. 역행렬은유일하게 존재한다. linalg.inv(X) # (n,n) 행렬 n −1
  26. 26. 역행렬의(잘알려진) 활용 선형연립방정식: a x = b , i ∈ {1, ⋯ , n} Ax = b A 가 존재한다면위방정식의해는 x =A b j=1 ∑ n ij j i −1 −1
  27. 27. 몇가지알아둬야할것들 1. X, Y 의역행렬이모두존재하는경우 (X ) = X (X ) = (X ) (XY) =Y X −1 −1 T −1 −1 T −1 −1 −1
  28. 28. 행렬식(Determinant) X = (x , ⋯ ,x ) : (n × n) 행렬 det(X) = ∣X∣ = ∣x ∣ 행렬식은모서리가 벡터x , ⋯ ,x 로이루어진n‑차원큐브의부피입니다 linalg.det(X) 1 n ij 1 n
  29. 29. X = (x ,x ,x ) =1 2 3 ⎣ ⎡x11 x21 x31 x12 x22 x32 x13 x23 x33 ⎦ ⎤
  30. 30. det(X) ≠ 0 이면역행렬X 이존재합니다 det(X) = 0 이면역행렬X 이존재하지않습니다 그러나유사역행렬(Pseudo inverse matrix)은구할수있습니다 −1 −1
  31. 31. 예제) 다음행렬의역행렬을구해보세요 A = A = np.array([[1,2,3],[4,5,6],[7,8,9]]) linalg.det(A) linalg.inv(A) ⎣ ⎡1 4 7 2 5 8 3 6 9⎦ ⎤
  32. 32. 역행렬이존재하지않는데가끔 linalg.inv 가 동작할때가 있습니다 그때는행렬식의값이너무작지않은지또는역행렬이너무크지않은지 조건상수(condition number)를확인해야합니다
  33. 33. Norm ∥X∥ (1 ≤ p ≤ ∞) Norm 은벡터, 행렬의크기 (≠ 부피)를나타내는양입니다 수치해석학에선Norm 의크기를통해오차를제어할수있습니다 p
  34. 34. ∥X∥ = ∣x ∣ linalg.norm(X,1) ∥X∥ = linalg.norm(X,2) linalg.norm(X, 'fro') ∥X∥ = ∣x ∣ linalg.norm(X, np.inf) 1 1≤j≤m max i=1 ∑ n ij H ⎷    x i=1 ∑ n j=1 ∑ m ij 2 ∞ 1≤i≤n max j=1 ∑ m ij
  35. 35. Ax = b K(A) = ∥A∥∥A ∥ : 조건상수 x : 참값,   : 추정값 ≤ ≤ K(A) −1 x^ K(A) 1 ∥b∥ ∥A − b∥x^ ∥ ∥x^ ∥x − ∥x^ ∥b∥ ∥A − b∥x^
  36. 36. 몇가지알아둬야할용어들 대각행렬(Diagonal matrix) D = (d ) 대칭행렬(Symmetric matrix) a = a ii (n×n) ij ji
  37. 37. 단위벡터(Unit vector) ∥v∥ = (v ⋅ v) = 1 직교행렬(Orthogonal matrix) A =A 정규직교행렬(Orthonormal matrix) : 직교행렬& 각 성분이단위벡터 ∥A ∥ = 1, 1 ≤ i ≤ n 1/2 T −1 i
  38. 38. 행렬분해(Matrix Decomposition) 대각분해(Diagonal Decomposition) A = UDU 특이벡터분해(SVD, Singular Vector Decomposition) A = UDV LU분해, Cholesky분해, QR분해, Polar분해, + 13 T T
  39. 39. X = np.array([[x11,..,x1m],..,[xn1,..,xnm]]) # (n,m) 행렬 SVD = linalg.svd(X) # [(n,n)행렬, (n,m)행렬, (m,m)행렬] SVD[0] # 정규직교행렬 np.matmul(SVD[0],SVD[0].T) SVD[1] # 대각행렬 : array 로 출력 SVD[2] # 정규직교행렬
  40. 40. 유사역행렬(Moore‑Penrose Pseudoinverse) SVD 를이용한다 A = UDV 이때A의유사역행렬은 A = VD U linalg.pinv(A) T + + T

×