데이터 사이언스 스쿨 의 내용을 토대로 수정 및 보완했습니다.
2.4 선형 연립방정식과 역행렬
선형 연립방정식
x 1 , x 2 , ⋯ , x M x_1, x_2, \cdots, x_M x 1 , x 2 , ⋯ , x M 이라는 M M M 개의 미지수를 가지는 N N N 개의 선형 연립방정식은 일반적으로 다음과 같은 형태가 된다. 이 식에서 a a a 와 b b b 는 방정식의 계수다.
a 11 x 1 + a 12 x 2 + ⋯ + a 1 M x M = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 M x M = b 2 ⋮ ⋮ ⋮ ⋮ a N 1 x 1 + a N 2 x 2 + ⋯ + a N M x M = b N (2.4.2) \begin{matrix} a_{11} x_1 & + \;& a_{12} x_2 &\; + \cdots + \;& a_{1M} x_M &\; = \;& b_1 \\ a_{21} x_1 & + \;& a_{22} x_2 &\; + \cdots + \;& a_{2M} x_M &\; = \;& b_2 \\ \vdots\;\;\; & & \vdots\;\;\; & & \vdots\;\;\; & & \;\vdots \\ a_{N1} x_1 & + \;& a_{N2} x_2 &\; + \cdots + \;& a_{NM} x_M &\; = \;& b_N \\ \end{matrix} \tag{2.4.2} a 1 1 x 1 a 2 1 x 1 ⋮ a N 1 x 1 + + + a 1 2 x 2 a 2 2 x 2 ⋮ a N 2 x 2 + ⋯ + + ⋯ + + ⋯ + a 1 M x M a 2 M x M ⋮ a N M x M = = = b 1 b 2 ⋮ b N ( 2 . 4 . 2 )
[ a 11 a 12 ⋯ a 1 M a 21 a 22 ⋯ a 2 M ⋮ ⋮ ⋱ ⋮ a N 1 a N 2 ⋯ a N M ] [ x 1 x 2 ⋮ x M ] = [ b 1 b 2 ⋮ b N ] (2.4.3) \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1M} \\ a_{21} & a_{22} & \cdots & a_{2M} \\ \vdots & \vdots & \ddots & \vdots \\ a_{N1} & a_{N2} & \cdots & a_{NM} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_M \end{bmatrix} = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_N \end{bmatrix} \tag{2.4.3} ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 ⋮ a N 1 a 1 2 a 2 2 ⋮ a N 2 ⋯ ⋯ ⋱ ⋯ a 1 M a 2 M ⋮ a N M ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ x 1 x 2 ⋮ x M ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ b 1 b 2 ⋮ b N ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ( 2 . 4 . 3 )
A = [ a 11 a 12 ⋯ a 1 M a 21 a 22 ⋯ a 2 M ⋮ ⋮ ⋱ ⋮ a N 1 a N 2 ⋯ a N M ] , x = [ x 1 x 2 ⋮ x M ] , b = [ b 1 b 2 ⋮ b N ] (2.4.4) A = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1M} \\ a_{21} & a_{22} & \cdots & a_{2M} \\ \vdots & \vdots & \ddots & \vdots \\ a_{N1} & a_{N2} & \cdots & a_{NM} \\ \end{bmatrix} , \;\; x = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_M \end{bmatrix} , \;\; b= \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_N \end{bmatrix} \tag{2.4.4} A = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 ⋮ a N 1 a 1 2 a 2 2 ⋮ a N 2 ⋯ ⋯ ⋱ ⋯ a 1 M a 2 M ⋮ a N M ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ , x = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ x 1 x 2 ⋮ x M ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ , b = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ b 1 b 2 ⋮ b N ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ( 2 . 4 . 4 )
A x = b (2.4.5) Ax = b \tag{2.4.5} A x = b ( 2 . 4 . 5 )
A , x , b A, x, b A , x , b 는 각각 계수행렬(coefficient matrix), 미지수벡터(unknown vector), 상수벡터(constant vector) 라고 부른다.
역행렬
정방 행렬 A A A 에 대한 역행렬(inverse matrix) A − 1 A^{-1} A − 1 은 원래의 행렬 A A A 와 다음 관계를 만족하는 정방 행렬을 말한다. I I I 는 항등 행렬(identity matrix)이다.
A − 1 A = A A − 1 = I (2.4.9) A^{-1} A = A A^{-1} = I \tag{2.4.9} A − 1 A = A A − 1 = I ( 2 . 4 . 9 )
행렬 A에 따라서는 존재하지 않을 수도 있다 . 역행렬이 존재하는 행렬을 가역행렬(invertible matrix) , 역행렬이 존재하지 않는 행렬을 비가역행렬(non-invertible matrix) 또는 특이행렬(singular matrix) 이라고 한다.
연습 문제 2.4.1
대각행렬의 역행렬은 각 대각성분의 역수로 이루어진 대각행렬과 같다.
[ λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ N ] − 1 = [ 1 λ 1 0 ⋯ 0 0 1 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 1 λ N ] (2.4.10) \begin{bmatrix} \lambda_{1} & 0 & \cdots & 0 \\ 0 & \lambda_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_{N} \\ \end{bmatrix}^{-1} = \begin{bmatrix} \dfrac{1}{\lambda_{1}} & 0 & \cdots & 0 \\ 0 & \dfrac{1}{\lambda_{2}} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \dfrac{1}{\lambda_{N}} \\ \end{bmatrix} \tag{2.4.10} ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ λ 1 0 ⋮ 0 0 λ 2 ⋮ 0 ⋯ ⋯ ⋱ ⋯ 0 0 ⋮ λ N ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ − 1 = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ λ 1 1 0 ⋮ 0 0 λ 2 1 ⋮ 0 ⋯ ⋯ ⋱ ⋯ 0 0 ⋮ λ N 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ( 2 . 4 . 1 0 )
N = 3 N=3 N = 3 일 때 위 식을 증명하라.
✒️
[ λ 1 0 0 0 λ 2 0 0 0 λ 3 ] [ 1 λ 1 0 0 0 1 λ 2 0 0 0 1 λ 3 ] = [ 1 λ 1 0 0 0 1 λ 2 0 0 0 1 λ 3 ] [ λ 1 0 0 0 λ 2 0 0 0 λ 3 ] = I \begin{bmatrix} \lambda_{1} & 0 & 0 \\ 0 & \lambda_{2} & 0 \\ 0 & 0 & \lambda_{3} \\ \end{bmatrix} \begin{bmatrix} \dfrac{1}{\lambda_{1}} & 0 & 0 \\ 0 & \dfrac{1}{\lambda_{2}} & 0 \\ 0 & 0 & \dfrac{1}{\lambda_{3}} \\ \end{bmatrix} = \begin{bmatrix} \dfrac{1}{\lambda_{1}} & 0 & 0 \\ 0 & \dfrac{1}{\lambda_{2}} & 0 \\ 0 & 0 & \dfrac{1}{\lambda_{3}} \\ \end{bmatrix} \begin{bmatrix} \lambda_{1} & 0 & 0 \\ 0 & \lambda_{2} & 0 \\ 0 & 0 & \lambda_{3} \\ \end{bmatrix} = I ⎣ ⎢ ⎡ λ 1 0 0 0 λ 2 0 0 0 λ 3 ⎦ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ λ 1 1 0 0 0 λ 2 1 0 0 0 λ 3 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ λ 1 1 0 0 0 λ 2 1 0 0 0 λ 3 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎡ λ 1 0 0 0 λ 2 0 0 0 λ 3 ⎦ ⎥ ⎤ = I
역행렬의 성질
( A T ) − 1 = ( A − 1 ) T (A^{T})^{-1} = (A^{-1})^{T} ( A T ) − 1 = ( A − 1 ) T
( A B ) − 1 = B − 1 A − 1 (AB)^{-1} = B^{-1} A^{-1} ( A B ) − 1 = B − 1 A − 1
( A B C ) − 1 = C − 1 B − 1 A − 1 (ABC)^{-1} = C^{-1} B^{-1} A^{-1} ( A B C ) − 1 = C − 1 B − 1 A − 1
역행렬의 계산
역행렬은 행렬식을 이용하여 다음처럼 계산할 수 있다. 증명은 생략한다.
A − 1 = 1 det ( A ) C T = 1 det ( A ) [ C 1 , 1 ⋯ C N , 1 ⋮ ⋱ ⋮ C 1 , N ⋯ C N , N ] (2.4.14) A^{-1} = \dfrac{1}{\det (A)} C^T = \dfrac{1}{\det (A)} \begin{bmatrix} C_{1,1} & \cdots & C_{N,1} \\ \vdots & \ddots & \vdots \\ C_{1,N} & \cdots & C_{N,N} \\ \end{bmatrix} \tag{2.4.14} A − 1 = det ( A ) 1 C T = det ( A ) 1 ⎣ ⎢ ⎢ ⎡ C 1 , 1 ⋮ C 1 , N ⋯ ⋱ ⋯ C N , 1 ⋮ C N , N ⎦ ⎥ ⎥ ⎤ ( 2 . 4 . 1 4 )
이 식에서 C i , j C_{i,j} C i , j 는 A A A 의 i , j {i,j} i , j 번째 원소에 대해 정의한 코팩터(cofactor)다.
코팩터로 이루어진 행렬 C C C 을 여인수행렬(matrix of cofactors, 또는 cofactor matrix, comatrix) 이라고 한다. 또 여인수행렬의 전치행렬 C T C^T C T 를 어드조인트행렬 (adjoint matrix, adjugate matrix , 수반행렬)이라고 하며 adj ( A ) \text{adj}(A) adj ( A ) 로 표기하기도 한다.
위 식에서 det ( A ) = 0 \det(A)=0 det ( A ) = 0 이면 역수가 존재하지 않으므로 역행렬은 행렬식이 0이 아닌 경우에만 존재한다 는 것을 알 수 있다.
연습 문제 2.4.2
코팩터 식을 사용하여 다음 공식을 증명하라.
[ a 11 a 12 a 21 a 22 ] − 1 = 1 a 11 a 22 − a 12 a 21 [ a 22 − a 12 − a 21 a 11 ] (2.4.15) \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix}^{-1} = \dfrac{1}{a_{11}a_{22} - a_{12}a_{21}} \begin{bmatrix} a_{22} & -a_{12} \\ -a_{21} & a_{11} \end{bmatrix} \tag{2.4.15} [ a 1 1 a 2 1 a 1 2 a 2 2 ] − 1 = a 1 1 a 2 2 − a 1 2 a 2 1 1 [ a 2 2 − a 2 1 − a 1 2 a 1 1 ] ( 2 . 4 . 1 5 )
✒️
자명
연습 문제 2.4.3
다음 역행렬을 계산하라.
(1)
[ 2 0 0 1 ] − 1 (2.4.16) \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}^{-1} \tag{2.4.16} [ 2 0 0 1 ] − 1 ( 2 . 4 . 1 6 )
✒️
det = 2 이므로
[ 2 0 0 1 ] − 1 = [ 0.5 0 0 1 ] \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}^{-1} = \begin{bmatrix} 0.5 & 0 \\ 0 & 1 \end{bmatrix} [ 2 0 0 1 ] − 1 = [ 0 . 5 0 0 1 ]
(2)
[ 1 2 − 1 2 1 2 1 2 ] − 1 (2.4.17) \begin{bmatrix} \dfrac{1}{\sqrt{2}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix}^{-1} \tag{2.4.17} ⎣ ⎢ ⎢ ⎡ 2 1 2 1 − 2 1 2 1 ⎦ ⎥ ⎥ ⎤ − 1 ( 2 . 4 . 1 7 )
✒️
det = 1
[ 1 2 − 1 2 1 2 1 2 ] − 1 = [ 1 2 1 2 − 1 2 1 2 ] (2.4.17) \begin{bmatrix} \dfrac{1}{\sqrt{2}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix}^{-1} \tag{2.4.17} = \begin{bmatrix} \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \\ -\dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix} ⎣ ⎢ ⎢ ⎡ 2 1 2 1 − 2 1 2 1 ⎦ ⎥ ⎥ ⎤ − 1 = ⎣ ⎢ ⎢ ⎡ 2 1 − 2 1 2 1 2 1 ⎦ ⎥ ⎥ ⎤ ( 2 . 4 . 1 7 )
45° \degree ° 회전변환을 나타내는 행렬의 역행렬은 -45° \degree ° 회전변환을 나타낸다.
(3)
[ 3 13 − 1 2 2 13 1 2 ] − 1 (2.4.18) \begin{bmatrix} \dfrac{3}{\sqrt{13}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{2}{\sqrt{13}} & \dfrac{1}{\sqrt{2}} \end{bmatrix}^{-1} \tag{2.4.18} ⎣ ⎢ ⎢ ⎡ 1 3 3 1 3 2 − 2 1 2 1 ⎦ ⎥ ⎥ ⎤ − 1 ( 2 . 4 . 1 8 )
✒️
[ 3 13 − 1 2 2 13 1 2 ] − 1 = 26 5 [ 1 2 1 2 − 2 13 3 13 ] = [ 13 5 13 5 − 2 2 5 3 2 5 ] \begin{bmatrix} \dfrac{3}{\sqrt{13}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{2}{\sqrt{13}} & \dfrac{1}{\sqrt{2}} \end{bmatrix}^{-1} = \dfrac{\sqrt{26}}{5} \begin{bmatrix} \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \\ -\dfrac{2}{\sqrt{13}} & \dfrac{3}{\sqrt{13}} \end{bmatrix} = \begin{bmatrix} \dfrac{\sqrt{13}}{5} & \dfrac{\sqrt{13}}{5} \\ -\dfrac{2\sqrt{2}}{5} & \dfrac{3\sqrt{2}}{5} \end{bmatrix} ⎣ ⎢ ⎢ ⎡ 1 3 3 1 3 2 − 2 1 2 1 ⎦ ⎥ ⎥ ⎤ − 1 = 5 2 6 ⎣ ⎢ ⎢ ⎡ 2 1 − 1 3 2 2 1 1 3 3 ⎦ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎡ 5 1 3 − 5 2 2 5 1 3 5 3 2 ⎦ ⎥ ⎥ ⎤
(4)
[ 1 1 0 0 1 1 1 1 1 ] − 1 (2.4.19) \begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 1 & 1 & 1 \\ \end{bmatrix}^{-1} \tag{2.4.19} ⎣ ⎢ ⎡ 1 0 1 1 1 1 0 1 1 ⎦ ⎥ ⎤ − 1 ( 2 . 4 . 1 9 )
✒️
det = 0 + 1 + 0 = 1
[ 1 1 0 0 1 1 1 1 1 ] − 1 = [ 0 1 − 1 − 1 1 0 1 − 1 1 ] \begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 1 & 1 & 1 \\ \end{bmatrix}^{-1} = \begin{bmatrix} 0 & 1 & -1 \\ -1 & 1 & 0 \\ 1 & -1 & 1 \\ \end{bmatrix} ⎣ ⎢ ⎡ 1 0 1 1 1 1 0 1 1 ⎦ ⎥ ⎤ − 1 = ⎣ ⎢ ⎡ 0 − 1 1 1 1 − 1 − 1 0 1 ⎦ ⎥ ⎤
연습 문제 2.4.4
두 정방행렬 A , B A,B A , B 에 대해서 A B = I AB = I A B = I 이면 B A = I BA= I B A = I 임을 증명하라.
A B = I → B A = I (2.4.20) AB = I \;\; \rightarrow \;\; BA = I \tag{2.4.20} A B = I → B A = I ( 2 . 4 . 2 0 )
✒️
A B = I AB = I A B = I 에서 양변에 det를 취하면 d e t ( A B ) = d e t ( A ) d e t ( B ) = d e t ( I ) = 1 det(AB) =det(A)det(B)= det(I)=1 d e t ( A B ) = d e t ( A ) d e t ( B ) = d e t ( I ) = 1 이므로
A A A , B B B 의 행렬식 모두 0이 아니고, 따라서 역행렬이 존재한다.
역행렬의 정의에 의해 B A = I BA= I B A = I 이 성립된다.
역행렬에 대한 정리
셔먼-모리슨(Sherman–Morrison) 공식
정방행렬 A A A 와 벡터 u , v u, v u , v 에 대해
( A + u v T ) − 1 = A − 1 − A − 1 u v T A − 1 1 + v T A − 1 u (2.4.21) (A+uv^T)^{-1} = A^{-1} - {A^{-1}uv^T A^{-1} \over 1 + v^T A^{-1}u} \tag{2.4.21} ( A + u v T ) − 1 = A − 1 − 1 + v T A − 1 u A − 1 u v T A − 1 ( 2 . 4 . 2 1 )
우드베리(Woodbury) 공식
정방행렬 A A A 와 이에 대응하는 적절한 크기의 행렬 U , V , C U,V,C U , V , C 에 대해
( A + U C V ) − 1 = A − 1 − A − 1 U ( C − 1 + V A − 1 U ) − 1 V A − 1 (2.4.22) \left(A+UCV \right)^{-1} = A^{-1} - A^{-1}U \left(C^{-1}+VA^{-1}U \right)^{-1} VA^{-1} \tag{2.4.22} ( A + U C V ) − 1 = A − 1 − A − 1 U ( C − 1 + V A − 1 U ) − 1 V A − 1 ( 2 . 4 . 2 2 )
분할행렬의 역행렬
4개 블록(block)으로 분할된 행렬(partitioned matrix)의 역행렬은 각 분할행렬을 이용하여 계산할 수 있다.
[ A 11 A 12 A 21 A 22 ] − 1 = [ A 11 − 1 ( I + A 12 F A 11 − 1 ) − A 11 − 1 A 12 F − F A 21 A 11 − 1 F ] (2.4.23) \begin{bmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{bmatrix}^{-1} = \begin{bmatrix} A_{11}^{-1}(I + A_{12}FA_{11}^{-1}) & -A_{11}^{-1}A_{12}F \\ -FA_{21}A_{11}^{-1} & F \end{bmatrix} \tag{2.4.23} [ A 1 1 A 2 1 A 1 2 A 2 2 ] − 1 = [ A 1 1 − 1 ( I + A 1 2 F A 1 1 − 1 ) − F A 2 1 A 1 1 − 1 − A 1 1 − 1 A 1 2 F F ] ( 2 . 4 . 2 3 )
이 식에서 F F F 는 다음과 같이 주어진다.
F = ( A 22 − A 21 A 11 − 1 A 12 ) − 1 (2.4.24) F = (A_{22} - A_{21}A_{11}^{-1}A_{12})^{-1} \tag{2.4.24} F = ( A 2 2 − A 2 1 A 1 1 − 1 A 1 2 ) − 1 ( 2 . 4 . 2 4 )
또는
F = ( A 11 − A 12 A 22 − 1 A 21 ) − 1 (2.4.25) F = (A_{11} - A_{12}A_{22}^{-1}A_{21})^{-1} \tag{2.4.25} F = ( A 1 1 − A 1 2 A 2 2 − 1 A 2 1 ) − 1 ( 2 . 4 . 2 5 )
넘파이를 사용한 역행렬 계산
linalg 서브패키지에 inv()
라는 명령어가 존재한다.
import numpy as np
A = np. array( [ [ 1 , 1 , 0 ] , [ 0 , 1 , 1 ] , [ 1 , 1 , 1 ] ] )
A
array([[1, 1, 0],
[0, 1, 1],
[1, 1, 1]])
Ainv = np. linalg. inv( A)
Ainv
array([[ 0., -1., 1.],
[ 1., 1., -1.],
[-1., 0., 1.]])
역행렬과 선형 연립방정식의 해
A − 1 A^{-1} A − 1 이 존재한다면 역행렬의 정의로부터 선형 연립방정식의 해는 다음처럼 구할 수 있다.
A x = b (2.4.26) Ax = b \tag{2.4.26} A x = b ( 2 . 4 . 2 6 )
A − 1 A x = A − 1 b (2.4.27) A^{-1}Ax = A^{-1}b \tag{2.4.27} A − 1 A x = A − 1 b ( 2 . 4 . 2 7 )
I x = A − 1 b (2.4.28) Ix = A^{-1}b \tag{2.4.28} I x = A − 1 b ( 2 . 4 . 2 8 )
x = A − 1 b (2.4.29) x = A^{-1}b \tag{2.4.29} x = A − 1 b ( 2 . 4 . 2 9 )
b = np. array( [ [ 2 ] , [ 2 ] , [ 3 ] ] )
b
array([[2],
[2],
[3]])
x = Ainv @ b
x
array([[1.],
[1.],
[1.]])
이 벡터를 원래의 연립방정식에 대입하여 상수벡터 b b b 와 값이 일치하는지 확인해보자.
A @ x - b
array([[0.],
[0.],
[0.]])
lstsq()
명령은 행렬 A A A 와 b b b 를 모두 인수로 받고 뒤에서 설명할 least square problem의 답 x
, (residual sum of squares resid
, rank
, singular value s
를 반환한다.
다음 코드에서 lstsq()
명령으로 구한 답이 inv()
명령으로 구한 답과 같음을 알 수 있다.
x, resid, rank, s = np. linalg. lstsq( A, b)
x
array([[1.],
[1.],
[1.]])
inv()
명령을 사용하는 것보다 수치오차가 적고 간단하므로 lstsq()
명령을 사용하는 것을 권장한다.
선형 연립방정식과 선형 예측모형
x 11 w 1 + x 12 w 2 + ⋯ + x 1 N w N = y 1 x 21 w 1 + x 22 w 2 + ⋯ + x 2 N w N = y 2 ⋮ ⋮ ⋮ ⋮ x N 1 w 1 + x N 2 w 2 + ⋯ + x N N w N = y N (2.4.30) \begin{matrix} x_{11} w_1 & + \;& x_{12} w_2 &\; + \cdots + \;& x_{1N} w_N &\; = \;& y_1 \\ x_{21} w_1 & + \;& x_{22} w_2 &\; + \cdots + \;& x_{2N} w_N &\; = \;& y_2 \\ \vdots\;\;\; & & \vdots\;\;\; & & \vdots\;\;\; & & \;\vdots \\ x_{N1} w_1 & + \;& x_{N2} w_2 &\; + \cdots + \;& x_{NN} w_N &\; = \;& y_N \\ \end{matrix} \tag{2.4.30} x 1 1 w 1 x 2 1 w 1 ⋮ x N 1 w 1 + + + x 1 2 w 2 x 2 2 w 2 ⋮ x N 2 w 2 + ⋯ + + ⋯ + + ⋯ + x 1 N w N x 2 N w N ⋮ x N N w N = = = y 1 y 2 ⋮ y N ( 2 . 4 . 3 0 )
X w = y (2.4.31) Xw = y \tag{2.4.31} X w = y ( 2 . 4 . 3 1 )
이 예측 모형의 가중치벡터 w w w 를 찾는 것은 계수행렬이 X X X , 미지수벡터가 w w w , 상수벡터가 y y y 인 선형 연립방정식의 답을 찾는 것과 같다. 그리고 만약 계수행렬, 여기에서는 특징행렬 X X X 의 역행렬 X − 1 X^{-1} X − 1 이 존재하면 다음처럼 가중치벡터를 구할 수 있다.
w = X − 1 y (2.4.32) w = X^{-1} y \tag{2.4.32} w = X − 1 y ( 2 . 4 . 3 2 )
연습 문제 2.4.5
보스턴 집값 문제를 선형 예측모형 A x = b ^ Ax=\hat{b} A x = b ^ 로 풀었을 때의 가중치 벡터 x x x 를 구하라. 입력 데이터를 범죄율(CRIM), 공기 오염도(NOX), 방의 개수(RM), 오래된 정도(AGE)의 4종류로 제한했고 데이터도 4개만 사용했다.
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
A = X[:4, [0, 4, 5, 6]] # 'CRIM', 'NOX', 'RM', 'AGE'
b = y[:4]
이렇게 구한 가중치의 크기나 부호가 우리의 직관이나 경험과 일치하는지 살펴보라.
✒️
주어진 코드에 이슈가 있다.
chat-GPT의 요약:
Scikit-learn 1.2 버전부터 load_boston
데이터셋이 삭제되었습니다. 윤리적 문제가 있기 때문입니다. 이 데이터셋의 사용은 비추천되며, 윤리적 문제를 연구하거나 교육하는 목적에만 사용해야 합니다.
따라서 링크에서 직접 원본 데이터셋을 불러온다.
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd. read_csv( data_url, sep= "\s+" , skiprows= 22 , header= None )
data = np. hstack( [ raw_df. values[ : : 2 , : ] , raw_df. values[ 1 : : 2 , : 2 ] ] )
target = raw_df. values[ 1 : : 2 , 2 ]
X = data
y = target
A = X[ : 4 , [ 0 , 4 , 5 , 6 ] ]
b = y[ : 4 ]
x = np. linalg. inv( A) @ b
x
array([-3.12710043e+02, -1.15193942e+02, 1.44996465e+01, -1.13259317e-01])
'CRIM' -312.71
범죄율이 높을수록 집 가격이 매우 크게 떨어진다.
'NOX', -115.19
공기오염도가 높을수록 집 가격이 크게 떨어진다.
'RM', +14.5
방의 개수가 많을수록 집 가격이 오른다.
'AGE' -0.11326
집이 오래되면 집 가격이 조금 떨어진다.
미지수의 수와 방정식의 수
지금까지는 미지수의 수와 방정식의 수가 같은 선형 연립방정식에 대해서만 생각했다. 그런데 만약 미지수의 수와 방정식의 수가 다르다면 어떻게 해야 할까?
미지수의 수와 방정식의 수를 고려해 볼 때 연립방정식에는 다음과 같은 세 종류가 있을 수 있다.
방정식의 수가 미지수의 수와 같다. (N = M N = M N = M )
방정식의 수가 미지수의 수보다 적다. (N < M N < M N < M )
방정식의 수가 미지수의 수보다 많다. (N > M N > M N > M )
1번의 경우, 즉 방정식의 수가 미지수의 수와 같은 경우는 앞에서 다루었다.
2번의 경우, 즉 방정식의 수가 미지수의 수보다 적을 때는 무수히 많은 해가 존재할 수 있다.
3번의 경우, 즉 방정식의 수가 미지수의 수보다 많을 때는 해가 없을 수 있다.
선형 예측모형을 구하는 문제는 계수행렬이 특징행렬 X X X , 미지수벡터가 가중치벡터 w w w 인 선형 연립방정식 문제이다. 그런데 보통 데이터의 수는 입력차원보다 큰 경우가 많다. 선형 연립방정식의 해가 존재하지 않으므로 선형 연립방정식을 푸는 방식으로는 선형 예측모형의 가중치벡터를 구할 수 없다.
최소자승문제
x 1 + x 2 = 2 x 2 + x 3 = 2 x 1 + x 2 + x 3 = 3 x 1 + x 2 + 2 x 3 = 4.1 (2.4.37) \begin{matrix} x_1 & + & x_2 & & & = & 2 \\ & & x_2 & + & x_3 & = & 2 \\ x_1 & + & x_2 & + & x_3 & = & 3 \\ x_1 & + & x_2 & + & 2x_3 & = & 4.1 \\ \end{matrix} \tag{2.4.37} x 1 x 1 x 1 + + + x 2 x 2 x 2 x 2 + + + x 3 x 3 2 x 3 = = = = 2 2 3 4 . 1 ( 2 . 4 . 3 7 )
이 선형 연립방정식의 해는 존재하지 않는다.
하지만 꼭 양변이 정확하게 똑같지 않아도 된다면 어떨까?
x 1 = x 2 = x 3 = 1 x_1 = x_2 = x_3 = 1 x 1 = x 2 = x 3 = 1 를 위 방정식에 대입하면 결과는 다음과 같다.
x 1 + x 2 = 2 x 2 + x 3 = 2 x 1 + x 2 + x 3 = 3 x 1 + x 2 + 2 x 3 = 4 ≈ 4.1 (2.4.38) \begin{matrix} x_1 & + & x_2 & & & = & 2 & &\\ & & x_2 & + & x_3 & = & 2 & &\\ x_1 & + & x_2 & + & x_3 & = & 3 & &\\ x_1 & + & x_2 & + & 2x_3 & = & 4 & \approx & 4.1 \end{matrix} \tag{2.4.38} x 1 x 1 x 1 + + + x 2 x 2 x 2 x 2 + + + x 3 x 3 2 x 3 = = = = 2 2 3 4 ≈ 4 . 1 ( 2 . 4 . 3 8 )
상당히 비슷하게 예측한 값이라고 할 수 있다.
미지수의 개수보다 방정식의 개수가 많아서 선형 연립방정식으로 풀수 없는 문제는 좌변과 우변의 차이를 최소화하는 문제로 바꾸어 풀 수 있다.
e = A x − b (2.4.39) e = Ax - b \tag{2.4.39} e = A x − b ( 2 . 4 . 3 9 )
잔차는 벡터이므로 최소자승문제에서는 벡터의 크기 중에서 벡터의 놈(norm)을 최소화 하는 문제를 푼다. 앞 절에서 놈을 최소화하는 것은 놈의 제곱을 최소화하는 것과 같다고 했다. 여기에서는 잔차제곱합이 놈의 제곱이 된다.
e T e = ∥ e ∥ 2 = ( A x − b ) T ( A x − b ) (2.4.40) e^Te = \Vert e \Vert^2 = (Ax-b)^T(Ax-b) \tag{2.4.40} e T e = ∥ e ∥ 2 = ( A x − b ) T ( A x − b ) ( 2 . 4 . 4 0 )
이 값을 최소화하는 x x x 값은 수식으로 다음처럼 표현한다.
x = arg min x e T e = arg min x ( A x − b ) T ( A x − b ) (2.4.41) x = \text{arg} \min_x e^Te = \text{arg} \min_x \; (Ax-b)^T(Ax-b) \tag{2.4.41} x = arg x min e T e = arg x min ( A x − b ) T ( A x − b ) ( 2 . 4 . 4 1 )
위 식에서 arg min x f ( x ) \text{arg} \min_x f(x) arg min x f ( x ) 는 함수 f ( x ) f(x) f ( x ) 를 가장 작게 만드는 x x x 값을 의미한다.
이러한 문제를 최소자승문제(least square problem) 라고 한다.
A x ≈ b (2.4.42) Ax \approx b \tag{2.4.42} A x ≈ b ( 2 . 4 . 4 2 )
A T A x = A T b (2.4.43) A^TAx = A^Tb \tag{2.4.43} A T A x = A T b ( 2 . 4 . 4 3 )
만약 정방 행렬 A T A A^TA A T A 의 역행렬 ( A T A ) − 1 (A^TA)^{-1} ( A T A ) − 1 이 존재한다면
( A T A ) − 1 ( A T A ) x = ( A T A ) − 1 A T b (2.4.44) (A^TA)^{-1}(A^TA)x = (A^TA)^{-1}A^Tb \tag{2.4.44} ( A T A ) − 1 ( A T A ) x = ( A T A ) − 1 A T b ( 2 . 4 . 4 4 )
x = ( ( A T A ) − 1 A T ) b (2.4.45) x = ((A^TA)^{-1}A^T) b \tag{2.4.45} x = ( ( A T A ) − 1 A T ) b ( 2 . 4 . 4 5 )
( A T A ) − 1 A T (A^TA)^{-1}A^T ( A T A ) − 1 A T 를 행렬 A A A 의 의사역행렬(pseudo inverse) 이라고 하며 A + A^{+} A + 로 표기한다.
A + = ( A T A ) − 1 A T (2.4.46) A^{+} = (A^TA)^{-1}A^T \tag{2.4.46} A + = ( A T A ) − 1 A T ( 2 . 4 . 4 6 )
x = A + b (2.4.47) x = A^+ b \tag{2.4.47} x = A + b ( 2 . 4 . 4 7 )
넘파이의 lstsq()
명령은 최소자승문제를 푸는 명령이다.
A = np. array( [ [ 1 , 1 , 0 ] , [ 0 , 1 , 1 ] , [ 1 , 1 , 1 ] , [ 1 , 1 , 2 ] ] )
A
array([[1, 1, 0],
[0, 1, 1],
[1, 1, 1],
[1, 1, 2]])
b = np. array( [ [ 2 ] , [ 2 ] , [ 3 ] , [ 4.1 ] ] )
b
array([[2. ],
[2. ],
[3. ],
[4.1]])
우선 의사역행렬을 직접 계산하여 해를 구해보자.
Apinv = np. linalg. inv( A. T @ A) @ A. T
Apinv
array([[ 0.33333333, -1. , 0.33333333, 0.33333333],
[ 0.5 , 1. , 0. , -0.5 ],
[-0.5 , 0. , 0. , 0.5 ]])
x = Apinv @ b
x
array([[1.03333333],
[0.95 ],
[1.05 ]])
이 해를 이용하여 b값을 구하면 다음처럼 우변과 소수점 아래 한자리 오차내에 있는 것을 볼 수 있다.
A @ x
array([[1.98333333],
[2. ],
[3.03333333],
[4.08333333]])
lstsq()
명령으로 바로 구해도 같은 값이 나온다.
x, resid, rank, s = np. linalg. lstsq( A, b)
x
array([[1.03333333],
[0.95 ],
[1.05 ]])
위 코드에서 resid
는 잔차벡터의 e = A x − b e=Ax-b e = A x − b 의 제곱합, 즉 놈의 제곱이다.
resid, np. linalg. norm( A @ x - b) ** 2
(array([0.00166667]), 0.001666666666666655)
연습 문제 2.4.6
보스턴 집값 문제를 선형 예측모형 X w = y ^ Xw=\hat{y} X w = y ^ 로 풀었을 때의 가중치벡터 w w w 를 최소 자승 방법으로 구하라. 가중치 벡터의 각 원소의 부호가 우리의 직관이나 경험과 일치하는지 살펴보라. 또 연습문제 2.4.5에서 구한 값과 어떻게 달라지는지 살펴보라.
행렬 X의 각 열이 의미하는 바는 다음과 같다.
1. CRIM: 범죄율
2. INDUS: 비소매상업지역 면적 비율
3. NOX: 일산화질소 농도
4. RM: 주택당 방 수
5. LSTAT: 인구 중 하위 계층 비율
6. B: 인구 중 흑인 비율
7. PTRATIO: 학생/교사 비율
8. ZN: 25,000 평방피트를 초과 거주지역 비율
9. CHAS: 찰스강의 경계에 위치한 경우는 1, 아니면 0
10. AGE: 1940년 이전에 건축된 주택의 비율
11. RAD: 방사형 고속도로까지의 거리
12. DIS: 보스톤 직업 센터 5곳까지의 가중평균거리
13. TAX: 재산세율
✒️
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd. read_csv( data_url, sep= "\s+" , skiprows= 22 , header= None )
data = np. hstack( [ raw_df. values[ : : 2 , : ] , raw_df. values[ 1 : : 2 , : 2 ] ] )
target = raw_df. values[ 1 : : 2 , 2 ]
X = data
y = target
x, resid, rank, s = np. linalg. lstsq( X, y, rcond= None )
x
array([-9.28965170e-02, 4.87149552e-02, -4.05997958e-03, 2.85399882e+00,
-2.86843637e+00, 5.92814778e+00, -7.26933458e-03, -9.68514157e-01,
1.71151128e-01, -9.39621540e-03, -3.92190926e-01, 1.49056102e-02,
-4.16304471e-01])
1. CRIM: 범죄율
-9.28965170e-02
범죄율이 높으면 집 값이 떨어진다.
2. INDUS: 비소매상업지역 면적 비율
4.87149552e-02
비소매 상업 용지(사무실, 제조업 등)의 비율을 나타내는 필드로, 주택이 있는 지역 에 존재하는 상업적 사용을 위한 토지의 비율을 측정한 데이터
비소매상업지역 면적 비율이 높으면 직장애서 가까운 집이 많다는 뜻이니까 수요가 높은 지역일 것이다. 따라서 이 수치가 높을수록 집 값이 오른다.
3. NOX: 일산화질소 농도
-4.05997958e-03
대기오염이 심할수록 집 값이 떨어진다.
4. RM: 주택당 방 수
2.85399882e+00
방이 많을수록 집 값이 오른다.
5. LSTAT: 인구 중 하위 계층 비율
-2.86843637e+00
인구 중 하위 계층 비율이 높을수록 높은 집 값을 감당하지 못할 것이므로 이 수치가 높을수록 집 값이 떨어진다.
6. B: 인구 중 흑인 비율
5.92814778e+00
7. PTRATIO: 학생/교사 비율
-7.26933458e-03
교사 대비 학생이 많아지면 교육의 질이 떨어지므로 이 수치가 높을수록 집 값이 떨어진다.
8. ZN: 25,000 평방피트를 초과 거주지역 비율
-9.68514157e-01
25,000 평방피트(702평) 보다 큰 집이 많이 있는 지역은 집 값이 높을 것으로 예측했는데 결과의 부호는 반대로 나왔다.
9. CHAS: 찰스강의 경계에 위치한 경우는 1, 아니면 0
1.71151128e-01
강이 있으면 좋으니까 이 수치가 높을수록 집 값이 오른다.
10. AGE: 1940년 이전에 건축된 주택의 비율
-9.39621540e-03
오래될수록 집 값이 떨어진다.
11. RAD: 방사형 고속도로까지의 거리
-3.92190926e-01
교통편이 좋을수록 집 값이 오를 것이다. 고속도로까지의 거리 값이 클수록 교통편이 안좋다는 의미이므로 이 수치가 높을수록 집 값이 떨어진다.
12. DIS: 보스톤 직업 센터 5곳까지의 가중평균거리
1.49056102e-02
직업 센터가 가까우면 그래도 좋긴 하니까 이 수치가 높을수록 집 값이 떨어질 것으로 예측했는데 결과의 부호는 반대로 나왔다.
13. TAX: 재산세율
-4.16304471e-01
세금을 많이내는 지역일수록 집 값이 떨어진다.