본문 바로가기
스터디/데이터사이언스

[NumPy] 넘파이 - 선형대수

by 궁금한 준이 2023. 2. 14.
728x90
반응형

numpy.linalg 모듈에 선형대수 관련 함수들이 있다. 내부적으로는 원래 선형대수 라이브러리인 BLAS와 LAPACK을 바탕으로 구현되어있다고 한다. (이 두 라이브러리를 사용하진 않았지만 아마 함수 이름이나 API가 같을 것으로 예상된다.)

 

또한 Scipy와도 많은 부분이 공통된 함수가 있는데, 일부 기능은 Scipy가 더 많이 가지고 있다. 예를 들어, LU-decomposition은 numpy.linalg에는 없지만 scipy.linalg에는 있다고 한다.

 

numpy 1.10.0 부터는, 2차원 행렬의 곱셈에 한해 numpy.matmul 대신에 @ 를 대신할 수 있다고 한다.

 

포스팅에서는 자주 사용하는 몇 개의 함수만 살펴보고 모든 함수에 대한 설명은 도큐먼트를 참고하자

 

Matrix and vector products (not using numpy.linalg)

a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(np.dot(a, b))

----- result -----
140

a = np.random.randint(1, 4, size=(2, 3))
b = np.random.randint(1, 3, size=(3, 2))
print(a)
print(b)
print(np.dot(a, b))
print(a @ b)

----- result -----
[[1 2 2]
 [2 2 2]]
[[2 1]
 [1 1]
 [2 2]]
[[ 8  7]
 [10  8]]
[[ 8  7]
 [10  8]]

 

Linear Algebra functions

eigenvalues and eigenvectors

w, v = numpy.linalg.eig(a)

a 는 정사각행렬이고, 리턴값 w 는 eigenvalue를 담고 있는 배열, 리턴값 v는 정규화된 eigenvector이다. v[:, i]는 w[i]에 해당하는 normalized eigenvector이다.

a = np.diag((1, 2, 3))
print('a:\n', a)

w, v = np.linalg.eig(a)
print('w:\n', w)
print('v:\n', v)

 

Inverse matrix

 

B = numpy.linalg.pinv(a)

정사각행렬이 아닌 임의의 행렬 a 에 대하여 의사역행렬(pseudo-inverse matrix) B 를 구하는 함수

내부적으로는 $\min \lVert Ax - b \rVert_2$ 이 되는 $A$를 구하는 것이라고 한다.

 

제대로 의사역행렬($A^+$)을 구했는지는 아래 식을 이용하여 검증한다. numpy.allclose를 이용한다.

\[ A A^+ A = A^+ A A^+ = A \]

a = np.random.randint(0, 4, size=(2, 3))
b = np.linalg.pinv(a)
print(np.allclose(a, np.dot(a, np.dot(b, a)))) # True
print(np.allclose(b, np.dot(b, np.dot(a, b)))) # True

참고

https://numpy.org/doc/stable/reference/routines.linalg.html

728x90
반응형