일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Python
- classification
- nerf
- FineGrained
- Torch
- math
- SSL
- dl
- 딥러닝
- PRML
- REACT
- algorithm
- ML
- computervision
- GAN
- Front
- 3d
- Meta Learning
- web
- clean code
- FGVC
- CV
- Depth estimation
- 머신러닝
- 자료구조
- nlp
- Vision
- pytorch
- 알고리즘
- cs
- Today
- Total
KalelPark's LAB
[ CLEAN CODE ] Clean Python, Numpy with Linear Algebra 본문
[ CLEAN CODE ] Clean Python, Numpy with Linear Algebra
kalelpark 2023. 1. 21. 22:27
Machine Learning 및 Deep Learning에서는 선형대수를 알아야 하는 것은 필수입니다..!
선형대수와 관련된 Numpy를 톺아보도록 하겠습니다.
- 단위 행렬(identity Matrix) : np.Unit(x)
- 대각 행렬(Diagonal Matrix) : np.diag(x)
- 내적(Dot Product, inner product) : np.dot(a, b)
- 대각합(Trace) : np.trace(x)
- 행렬식(Matrix Determinant) : np.linalg.det(x)
- 역행렬(Inverse of a Matrix) : np.linalg.inv(x)
- 고유값(Eigenvalue) : np.linalg.eig(x)
- 특이값 분해(Singular Value Decomposition) : np.linalg.svd(A)
- 연립방정식 해 풀기(Solve a linear matrix equation) : np.linalg.solved(a, b)
단위 행렬 혹은 항등행렬(Unit Matrix, Identity Matrix)
단위행렬은 대각원소가 1이고, 나머지는 모두 0인 n차 정방행렬을 말합니다. numpy의 eye() 함수를 사용해서 만들 수 있습니다.
import numpy as np
mat_4 = np.eye(4)
print(mat_4)
>> [[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
대각 행렬(Diagonal Matrix)
대각 행렬은 대각성분 이외의 모든 성분이 모두 "0"인 n차 정방행렬을 의미합니다.
import numpy as np
x = np.arange(9).reshape(3, 3)
print(np.diag(x))
print(np.diag(np.diag(x)))
>> [0 4 8]
>> [[0 0 0]
[0 4 0]
[0 0 8]]
내적(Dot Product)
Python에서의 두 행렬 간의 곱은 원소 간 곱(element wise product)을 반환하며, 선형대수에서 말하는 행렬 간 내적 곱은
np.dot() 함수를 사용합니다.
import numpy as np
a = np.arange(4).reshape(2, 2)
print(a)
print(np.dot(a, a))
>> [[0 1]
[2 3]]
>> [[ 2 3]
[ 6 11]]
대각 합(Trace)
정방행렬의 대각에 위치한 원소를 전부 더합니다.
import numpy as np
b = np.arange(16).reshape(4, 4)
print(b)
print(np.trace(b))
>> [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
>> 30
행렬식(Matrix Determinant)
역행렬이 존재하는지 여부에 따라 행렬식(determinant)이라는 지표를 사용합니다.
행렬식이 0이 아니면 역행렬이 존재하고, 0이면 역행렬이 존재하지 않습니다.
import numpy as np
deter = np.array([[1, 2], [3, 4]])
print(np.linalg.det(deter))
>> -2.0002
역행렬(Inverse of a Matrix)
역행렬은 n차 정방행렬을 항등행렬 혹은 단위 행렬로 표현되는 것들을 의미합니다. 두 순서에 상관없이 곱했을 때
단위행렬이 나오는 n차정방행렬이 있다면 역행렬이 존재하는 것입니다.
역행렬은 가우스 소거법(Gauss-Jordan Elimination Method)혹은 여인수(cofactor method)로 풀 수 있습니다.
import numpy as np
ivv = np.array(range(4)).reshape(2, 2)
print(np.linalg.inv(ivv))
>> [[-1.5 0.5]
[ 1. 0. ]]
고유값 행렬(Eigenvalue)
https://angeloyeo.github.io/2019/07/17/eigen_vector.html << 링크를 참고하시면 더욱 이해가 잘 될 것입니다..!
ttt = np.array([[4, 2], [3, 5]])
w, v = np.linalg.eig(ttt)
print(w)
print(v)
>> [2. 7.]
>> [[-0.70710678 -0.5547002 ]
[ 0.70710678 -0.83205029]]
특이값 분해(Signular Value Decomposition)
고유값 분해를 행렬로 대각화하는 방법으로써, 정방행렬뿐만 아니라 모든 행렬에 대해 적용 가능합니다.
특이값 분해는 차원축소, 데이터 압축등에서 사용될 수 있습니다.
A = np.array([[3,6], [2,3], [0,0], [0,0]])
u, s, vh = np.linalg.svd(A)
print(u)
print(s)
print(vh)
>> [[-0.8816746 -0.47185793 0. 0. ]
[-0.47185793 0.8816746 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 1. ]]
>> [7.60555128 0.39444872]
>> [[-0.47185793 -0.8816746 ]
[ 0.8816746 -0.47185793]]
연립방정식 해 풀기(Solve a linear matrix equation)
4x_{1} + 3x_{2} = 23
3x_{1} + 2x_{2} =16
위의 연립방정식 해를 해결합니다.
import numpy as np
a = np.array([[4, 3], [3, 2]])
b = np.array([23, 16])
x = np.linalg.solve(a, b)
print(x)
print(np.allclose(np.dot(a, x), b))
>> [2. 5.]
>> True
'Python > CLEAN CODE' 카테고리의 다른 글
[ CLEAN CODE ] PEP(Python enhancement proposal) 8, string? (0) | 2023.03.12 |
---|---|
[ CLEAN CODE ] Clean Python, *args, **kwargs? (0) | 2023.01.25 |
[ CLEAN CODE ] Clean Python, broadcast_to, linspace란? (0) | 2023.01.21 |
[ CLEAN CODE ] Clean Python, YACS(Yet Another Configuration System)란? (0) | 2023.01.14 |
[ CLEAN CODE ] Clean Python, StaticMethod, ClassMethod란? (0) | 2023.01.13 |