역행렬이란?
$\mathbf{X}$에 대한 역행렬(inverse matrix)은 정사각 행렬 $\mathbf{X}$와 곱했을 때 단위 행렬(Identity Matrix)가 되는 행렬을 말한다. $\mathbf{X}$에 대한 역행렬은 $\mathbf{X}^{-1}$로 표현되며, 수식으로는 다음과 같이 표현된다.
$\mathbf{X} \cdot \mathbf{X}^{-1} = \mathbf{X}^{-1} \cdot \mathbf{X} = \mathbf{I}$
역행렬의 존재 여부 판단하기
역행렬은 원래의 행렬과 곱했을 때 단위 행렬이어야 하므로, 행과 열의 개수가 같은 정사각 행렬이어야 한다. 또 다른 조건은 행렬식(Determinant)이 0이 아닌 값이어야 한다.
역행렬 계산 방식
1. 행렬식과 수반 행렬 사용
행렬식과 수반 행렬을 사용하면 구할 수 있다. 이 방식은 우리가 고등학교 때 많이 사용하던 방식이다.
$\mathbf{X}^{-1} = \frac{1}{\det(\mathbf{X})} \cdot \text{adj}(\mathbf{X})$
2. 가우스 조던 소거법
가우스 조던 소거법을 통해 역행렬을 구할 수 있다. 자세한 내용은 아래 링크를 참고 하면 된다.
https://simcode.tistory.com/69
3. LU 분해(LU decomposition)
행렬을 하삼각 행렬(Lower triangular matrix)과 상삼각 행렬(Upper triangular matrix)로 분해한 후, 역행렬을 계산하는 방법이다.
Numpy, TensorFlow, PyTorch에서의 역행렬 계산
만약 Numpy, TensorFlow, PyTorch를 사용한다면, 위의 역행렬 계산 방식들을 직접 알 필요 없이 한 줄로 계산이 가능하다.
Numpy 역행렬 계산
Numpy를 사용해 역행렬 계산을 하기 위해서는 np.linalg.inv() 함수를 사용하면 된다.
import numpy as np
# 행렬 정의
X = np.array([[1, 2], [3, 4]])
# 역행렬 계산
X_inv = np.linalg.inv(X)
print("Matrix X:\n", X)
print("Inverse of X:\n", X_inv)
# 확인 (X * X_inv 는 단위 행렬이어야 한다.)
identity = np.dot(X, X_inv)
print("X * X_inv:\n", identity)
위의 코드를 실행한 결과는 다음과 같다.
Matrix X:
[[1 2]
[3 4]]
Inverse of X:
[[-2. 1. ]
[ 1.5 -0.5]]
X * X_inv:
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]
(2,1)의 값은 매우 작은 값이라 0이라 봐도 된다.
TensorFlow 역행렬 계산
TensorFlow를 사용해 역행렬 계산을 하기 위해서는 tf.linalg.inv() 함수를 사용하면 된다.
import tensorflow as tf
# 행렬 정의
X = tf.constant([[1.0, 2.0], [3.0, 4.0]])
# 역행렬 계산
X_inv = tf.linalg.inv(X)
print("Matrix X:\n", X)
print("Inverse of X:\n", X_inv)
# 확인 (X * X_inv 는 단위 행렬이어야 한다.)
identity = tf.matmul(X, X_inv)
print("X * X_inv:\n", identity)
위의 코드를 실행한 결과는 다음과 같다.
Matrix X:
tf.Tensor(
[[1. 2.]
[3. 4.]], shape=(2, 2), dtype=float32)
Inverse of X:
tf.Tensor(
[[-2.0000002 1.0000001 ]
[ 1.5000001 -0.50000006]], shape=(2, 2), dtype=float32)
X * X_inv:
tf.Tensor(
[[ 1.0000000e+00 0.0000000e+00]
[-4.7683716e-07 1.0000002e+00]], shape=(2, 2), dtype=float32)
PyTorch 역행렬 계산
PyTorch를 사용해 역행렬 계산을 하기 위해서는 torch.inverse() 함수를 사용하면 된다.
import torch
# 행렬 정의
X = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
# 역행렬 계산
X_inv = torch.inverse(X)
print("Matrix X:\n", X)
print("Inverse of X:\n", X_inv)
# 확인 (X * X_inv 는 단위 행렬이어야 한다.
identity = torch.matmul(X, X_inv)
print("X * X_inv:\n", identity)
위의 코드를 실행한 결과는 다음과 같다.
Matrix X:
tensor([[1., 2.],
[3., 4.]])
Inverse of X:
tensor([[-2.0000, 1.0000],
[ 1.5000, -0.5000]])
X * X_inv:
tensor([[1., 0.],
[0., 1.]])
'Machine Learning Math > Linear Algebra' 카테고리의 다른 글
직교 행렬(Orthogonal Matrix)이란 무엇인가? (0) | 2024.07.31 |
---|---|
대각 행렬(Diagonal Matrix) 한 번에 정리하기 (0) | 2024.07.23 |
가우스 조던 소거법(Gauss-Jordan Elimination) 알아보기 (0) | 2024.07.21 |
대칭 행렬(Symmetric Matrix)와 단위 행렬(Identity Matrix) 한 번에 정리하기: Numpy, TensorFlow, PyTorch 사용해 단위 행렬 만들기 (0) | 2024.07.20 |
Frobenius Norm 이란 무엇인가? Numpy, TensorFlow, PyTorch에서의 Frobenius Norm 계산법 알아보기 (0) | 2024.07.19 |