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
참고
'스터디 > 데이터사이언스' 카테고리의 다른 글
[Data Science] 상관계수, Pearson, Spearman, Kendall (0) | 2023.03.17 |
---|---|
[Data Science] Basic Statistical Description of Data (0) | 2023.03.14 |
[Data Science] Attribute Types (0) | 2023.03.09 |
[pandas] [판다스] DataFrame 조작하기, MultiIndex (0) | 2023.02.15 |
[pandas] [판다스] 판다스 기초 (0) | 2023.02.15 |