일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- nodejs
- Babel
- javascript
- React
- rabbitmq
- Go
- deep learning
- laravel
- php
- SQL
- python
- Machine Learning
- Node
- 기초 수학
- nginx
- docker
- 블레이드 템플릿
- phpredis
- linux
- AWS
- Redis
- Redux
- webpack
- mariadb
- NCP
- fastapi
- CentOS
- For
- Backbone.js
- Switch
- Today
- Total
개발일기
기초 수학 - 행렬 판별식 본문
Determinant of a Matrix
행렬 판별식은 역행렬의 존재 여부를 판별해주는 식이다. 역행렬을 판별하기에 행렬 판별식은 정방 행렬로 이루어져 있다. 수식으로는 행렬 앞 뒤에 | 절대값 붙여 표시한다. $ A = \begin{bmatrix} a & b \\ c & d \\ \end{bmatrix}, |A|=ad - bc $ 로 표시하며 행렬 판별식으로 행렬의 계수를 구할 수 있으며 A행렬의 ad - bc 공식으로 구할 수 있다.
import numpy as np
A = np.array([[5, 1],
[4, 3]])
print(np.linalg.det(A)) # det()메서드로 행렬식 계산
"""
11.000000000000002
"""
행렬 판별식을 역행렬의 존재 여부를 판별하기에 ad - bc가 0이 되면 안된다.
# 행렬 판별식 0
import numpy as np
A = np.array([[5, 1],
[4, 3]])
B = np.array([[4, 1],
[8, 2]])
print(np.linalg.det(B)) # 행렬 판별식 0 -> 역행렬 없음
print(np.linalg.inv(A)) # 역행렬 계산 완료
print(np.linalg.inv(B)) # 오류
"""
0.0
[[ 0.27272727 -0.09090909]
[-0.36363636 0.45454545]]
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-12-14eb3deddd4f> in <cell line: 10>()
8 print(np.linalg.det(B)) # 행렬 판별식 0 -> 역행렬 없음
9 print(np.linalg.inv(A))
---> 10 print(np.linalg.inv(B))
1 frames
/usr/local/lib/python3.10/dist-packages/numpy/linalg/linalg.py in _raise_linalgerror_singular(err, flag)
110
111 def _raise_linalgerror_singular(err, flag):
--> 112 raise LinAlgError("Singular matrix")
113
114 def _raise_linalgerror_nonposdef(err, flag):
LinAlgError: Singular matrix
"""
ad - bc가 0인 행렬 B의 역행렬을 구하려고 하면 위와 같이 에러가 발생한다.
Pytorch
# Pytorch 행렬 판별식
import torch
A = torch.tensor([[5, 1],
[4, 3]])
A = A.type(torch.float64)
print(torch.det(A)) # tensor(11., dtype=torch.float64)
Pytorch에서는 det() 메서드로 계수를 구할 수 있다. 텐서는 정수형이 아닌 float형으로 텐서 타입이 지정되야 한다.
Tensorflow
# Tensorflow 행렬 판별식
import tensorflow as tf
A = tf.Variable([[5, 1],
[4, 3]], dtype=tf.float64)
print(tf.linalg.det(A)) # tf.Tensor(11.000000000000002, shape=(), dtype=float64)
Tensorflow는 numpy와 동일하게 linalg.det()를 사용하여 계수를 구한다. Pytorch와 마찬가지로 정수형이 아닌 float형으로 텐서 타입이 지정되야 한다.
다차원 행렬의 행렬 판별식
$ X = \begin{bmatrix} x_{1, 1} & x_{1, 2} & x_{1, 3} \\ x_{2, 1} & x_{2, 2} & x_{2, 3} \\ x_{3, 1} & x_{3, 2} & x_{3, 3} \\ \end{bmatrix} $ 3차원 행렬이 존재할 때, 재귀를 통해 행렬 판별식을 풀어나간다.
수식으로 보면 다음과 같다. $ x_{1,1} det(X_{1,1}) - x{1,2} det(X_{1,2}) + x{1,3} det(X_{1,3}) $
먼저 1행, 1열에 있는 요소를 제외하면 남아있는 $ x_{2, 2}, x_{2, 3}, x_{3, 2}, x_{3, 3} $ 의 행렬식을 구한다. 계산된 행렬식에 $ x_{1, 1} $을 곱한다. 이를 반복하여 $ x_{1, 2}, x_{1, 3} $ 순으로 진행하여 행렬 판별식을 구해간다. 또한 단계가 진행될 수록 계산 부호가 변경된다. 첫번째 행은 앞에 +부호가 위치했다면 다음 행은 -가 위치해야 한다. 즉, 위의 식을 바탕으로 보면 1행 1열은 +, 1행 2열은 -, 1행 3열은 +부호가 위치한다. 부호가 +, - 바뀌면서 위치한다.
간단하게 3차원 행렬로 보았지만 차수가 늘어가 4차원, 5차원으로 늘어나도 동일하게 계산한다. 먼저 1행 1열을 제외하고 남는 (4, 4)행렬의 행렬식을 구한다. 2행 2열을 제외한 (3, 3) 행렬의 행렬식을 구하는 단계가 이어져야 한다. (3, 3) 행렬만 남게되면 3행 3열을 제외하고 생성되는 (2, 2)행렬의 행렬식 ad - bd를 구하고 $ x_{3, 3} $곱한다. 계산된 결과에 $ x_{2, 2} $를 곱하고 $ x_{1, 1} $를 곱하면 1행 1열의 행렬식이 구해진다. 총 5행 5열이므로 1행 2열 제외, 1행 3열 제외 … 하는 식으로 계산 계산을 이어나가면 (5, 5) 행렬의 행렬식을 구해낼 수 있다. 하지만 이 과정은 서술하는것만으로도 복잡하게 느껴지므로 직접 계산하는것보다 코드를 통해 계산하는게 더 효율적이다.
다차원 행렬이라고 해서 특별한 메서드를 사용하는게 아닌 기존에 쓰던 det() 메서드를 사용하여 계산한다.
# 다차원 행렬의 행렬 판별식
import numpy as np
A = np.array([[3, 4, 4],
[2, 5, 8],
[6, 2, 9]])
print(np.linalg.det(A)) # 103.00000000000001
- 1행 1열을 제외하고 존재하는 (4, 4)행렬의 행렬식을 구한다.
- (4, 4) 행렬의 1행 1열을 제외하고 생성되는 (3, 3)행렬의 행렬식을 구한다.
- (3, 3) 행렬의 1행 1열을 제외하고 생성되는 (2, 2)행렬의 행렬식을 구한다.
- (2, 2)행렬식에 (3, 3) 행렬값을 곱한다.
- 4번에서 계산된 결과에 (2, 2) 행렬값을 곱한다.
- 5번에서 계산된 결과에 (1, 1) 행렬값을 곱한다.
- +1, -1, +1 ... 식으로 부호를 바꿔가며 1행 2열, 1행 3열, 1행 4열 순으로 1~6번의 과정을 반복해 나간다.
- 최종 결과를 합산하여 (5, 5) 행렬의 계수를 구해낸다.
참고 사이트:
https://www.mathsisfun.com/algebra/matrix-determinant.html
https://blog.naver.com/destiny9720/221402399478
https://www.geeksforgeeks.org/determinant-of-a-matrix/
https://colab.research.google.com/drive/1tMy6GgXRytsMz2A90CZleESUQqNxZARy?usp=sharing
'Deep Learning, Machine Learning > 기초 수학' 카테고리의 다른 글
기초 수학 - 특이값 분해(SVD) (0) | 2024.04.13 |
---|---|
기초 수학 - 고유값의 특성 (0) | 2024.03.31 |
기초 수학 - 고유 벡터와 고유값 (0) | 2024.03.31 |
기초 수학 - 행렬 (0) | 2024.03.27 |
기초수학 - 텐서의 전치와 내적 (0) | 2024.03.24 |