안녕하세요 :) 이번에 다뤄볼 분야는 linear algebra(선형대수)입니다. 사실 python 자체 내에서 지원해주는 전문적인 수학 라이브러리는 없습니다. 하지만, python의 가장 강점인 다양한 library중 가장 강력하고 많이 사용되는 Numpy라는 라이브러리가 있습니다. 이 라이브러리는 기본적인 선형대수나 푸리에 변환, 난수 등을 지원하고, 특히나 모든 다른 수학과 과학 라이브러리의 기본이 되는 데이터 구조(N-dimensional array)를 지원합니다. Data mining이나 data analysis에 기본이 되는 데이터를 다루는 데에 있어서 굉장히 중요한 container가 되는 셈이죠. 이 Numpy라이브러리를 사용하여 선형대수의 기본적인 방정식의 해를 구하는 예제를 풀어보겠습니다.
다음과 같은 방정식들이 있습니다. \[\begin{aligned} 3x+6y-5z&=12\newline x-3y+2z&=-2\newline 5x-y+4z&=10\end{aligned}\]
이를 선형대수의 형태로 치환하면,
\[\left[\begin{array}{ccc}
3&6&-5\newline
1&-3&2\newline
5&-1&4\end{array}\right]
\left[\begin{array}{c}
x\newline y\newline z
\end{array}
\right]
=\left[\begin{array}{c}
12\newline -2\newline 10
\end{array}
\right]
\]
가 됩니다. 그럼 먼저 어떻게 행렬을 numpy를 이용해 선언하는지 살펴봅시다. 먼저 numpy를 사용하기 위해서 우리는 라이브러리를 import해 줍니다. as
를 통해서 numpy
를 다 쓰지 않고 np
만으로 간단하게 줄여서 사용할 수 있게 됩니다.
>>> import numpy as np
>>> A = np.array([[3, 6, -5],
[1, -3, 2],
[5, -1, 4]])
>>> print A
[[ 3 6 -5]
[ 1 -3 2]
[ 5 -1 4]]
>>> b = np.array([12, -2, 10])
>>> print b
[12 -2 10]
잘 선언되어 있음을 확인하실 수 있죠? 그럼 이제 $Ax=b$의 상태에서 $x$를 구하는 방법은 다들 아시겠지만, \[x=A^{-1}b\] 가 되기 때문에 이를 numpy 라이브러리를 이용해서 풀면,
>>> x = np.linalg.inv(A).dot(b)
>>> print(x)
[ 1.75 1.75 0.75]
아주 손쉽게 구할 수 있음을 확인할 수 있죠? 참고로 np.linalg.inv(A)
만으로 $A$의 역행렬을 구할 수 있고, 여기에 .dot(b)
를 연속적으로 사용함으로써 역행렬과 $b$의 dot product를 구할 수 있게 됩니다.
실제로 np.matrix
의 데이터 구조를 사용하면 syntax적으로 더 쉽게 사용할 수도 있지만, np.array
가 워낙 일반적으로 많이 사용되기 때문에, 그리고 n차원까지도 쉽게 확장되기 때문에 이것을 사용하는 것을 권장해 드립니다 :)