KalelPark's LAB

[ CLEAN CODE ] Clean Python, Numpy with Linear Algebra 본문

Python/CLEAN CODE

[ 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

 

Comments