python/numpy
9. linalg 로 선형대수 연산하기
Abokadoh
2023. 2. 16. 17:17
데이터 분석을 하면서 선형대수 문제를 직접 푸는 경우가 있을 수 있다.
이때 사용할 수 있는 패키지 중 numpy의 linalg
(linear algebra)패키지를 공부해보자.
1. linalg 서브모듈을 활용하여 선형대수 연산
import numpy as np
numpy를 불러오고
- np.linalg.inv() 역행렬 구하기**
np.linalg.inv()
# <in>
x = np.random.rand(3, 3) #
np.linalg.inv(x)
# <out>
[[0.72618248 0.19402353 0.48140576]
[0.48550792 0.53459657 0.90389888]
[0.31030913 0.87959886 0.30089127]]
array([[ 2.05411703, -1.18238533, 0.26552117],
[-0.43531031, -0.22386038, 1.36895975],
[-0.84586309, 1.87380744, -0.95226783]])
linalg.inv
는 행렬의 역행렬을 구할 때 사용하는 함수로 모든 차원의 값이 같아야 사용 가능하다. (정방행렬만 가능)
# <in>
x = np.random.rand(3, 3) # 쉽게 말해 정방행렬만 가능하다.
print(x)
np.linalg.inv(x)
# <out>
array([[ 2.05411703, -1.18238533, 0.26552117],
[-0.43531031, -0.22386038, 1.36895975],
[-0.84586309, 1.87380744, -0.95226783]])
# <in>
x = np.random.rand(3, 3) # 쉽게 말해 정방행렬만 가능하다.
print(x)
np.linalg.inv(x)
np.matmul(x, np.linalg.inv(x)) # 행렬끼리의 곱은 @ 나 matmul을 사용한다.
x @ np.linalg.inv(x)
# <out>
[[0.38601181 0.79052001 0.55788342]
[0.29918071 0.1118871 0.40140801]
[0.65421519 0.72177853 0.76199419]]
[[-7.28046352 -7.11072846 9.07612331]
[ 1.23316702 -2.52225583 0.42584348]
[ 5.08260614 8.49410239 -6.88338897]]
array([[ 1.0000000e+00, 0.0000000e+00, 4.4408921e-16],
[ 0.0000000e+00, 1.0000000e+00, 8.8817842e-16],
[ 0.0000000e+00, -8.8817842e-16, 1.0000000e+00]])
rand
함수로 3X3 2차원을 행렬을 만들었고
linalg.inv()
를 사용해 그 역행렬을 만들었다
그리고 행렬끼리의 곱을 위해 matul()
함수를 사용했다.
결과가 잘 나왔다.
- np.linalg.solve - 해 구하기
linalg.solve()
함수는 Ax = B 형태의 선형대수식 솔루션을 제공한다.
예제로 공부해보자.
# <in>
# 호랑이와 홍합의 합은 25
# 호랑이 다리와 홍합 다리의 합은 64이다.
# x + y = 25
# 2x +4y = 64
A = np.array([[1, 1],[2, 4]])
B = np.array([25, 64])
x = np.linalg.solve(A, B)
x
np.allclose(A@x, B) # 두 행렬이 같은지를 비교 같으면 True 반환
# <out>
array([[18.],
[ 7.]])
True