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