[Linear algebra] 2.4 선형 연립방정식과 역행렬

J·3일 전
0

선형대수

목록 보기
4/6

데이터 사이언스 스쿨의 내용을 토대로 수정 및 보완했습니다.

2.4 선형 연립방정식과 역행렬

선형 연립방정식

x1,x2,,xMx_1, x_2, \cdots, x_M 이라는 MM 개의 미지수를 가지는 NN개의 선형 연립방정식은 일반적으로 다음과 같은 형태가 된다. 이 식에서 aabb는 방정식의 계수다.

a11x1+  a12x2  ++  a1MxM  =  b1a21x1+  a22x2  ++  a2MxM  =  b2                    aN1x1+  aN2x2  ++  aNMxM  =  bN(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}
[a11a12a1Ma21a22a2MaN1aN2aNM][x1x2xM]=[b1b2bN](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=[a11a12a1Ma21a22a2MaN1aN2aNM],    x=[x1x2xM],    b=[b1b2bN](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}
Ax=b(2.4.5)Ax = b \tag{2.4.5}

A,x,bA, x, b 는 각각 계수행렬(coefficient matrix), 미지수벡터(unknown vector), 상수벡터(constant vector) 라고 부른다.

역행렬

정방 행렬 AA에 대한 역행렬(inverse matrix) A1A^{-1}은 원래의 행렬 AA와 다음 관계를 만족하는 정방 행렬을 말한다. II는 항등 행렬(identity matrix)이다.

A1A=AA1=I(2.4.9)A^{-1} A = A A^{-1} = I \tag{2.4.9}

행렬 A에 따라서는 존재하지 않을 수도 있다. 역행렬이 존재하는 행렬을 가역행렬(invertible matrix), 역행렬이 존재하지 않는 행렬을 비가역행렬(non-invertible matrix) 또는 특이행렬(singular matrix) 이라고 한다.

연습 문제 2.4.1

대각행렬의 역행렬은 각 대각성분의 역수로 이루어진 대각행렬과 같다.

[λ1000λ2000λN]1=[1λ10001λ20001λ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}

N=3N=3일 때 위 식을 증명하라.

✒️

[λ1000λ2000λ3][1λ10001λ20001λ3]=[1λ10001λ20001λ3][λ1000λ2000λ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

역행렬의 성질

  • (AT)1=(A1)T(A^{T})^{-1} = (A^{-1})^{T}
  • (AB)1=B1A1(AB)^{-1} = B^{-1} A^{-1}
  • (ABC)1=C1B1A1(ABC)^{-1} = C^{-1} B^{-1} A^{-1}

역행렬의 계산

역행렬은 행렬식을 이용하여 다음처럼 계산할 수 있다. 증명은 생략한다.

A1=1det(A)CT=1det(A)[C1,1CN,1C1,NCN,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}

이 식에서 Ci,jC_{i,j}AAi,j{i,j}번째 원소에 대해 정의한 코팩터(cofactor)다.

코팩터로 이루어진 행렬 CC여인수행렬(matrix of cofactors, 또는 cofactor matrix, comatrix) 이라고 한다. 또 여인수행렬의 전치행렬 CTC^T어드조인트행렬(adjoint matrix, adjugate matrix, 수반행렬)이라고 하며 adj(A)\text{adj}(A) 로 표기하기도 한다.

위 식에서 det(A)=0\det(A)=0이면 역수가 존재하지 않으므로 역행렬은 행렬식이 0이 아닌 경우에만 존재한다는 것을 알 수 있다.

연습 문제 2.4.2

코팩터 식을 사용하여 다음 공식을 증명하라.

[a11a12a21a22]1=1a11a22a12a21[a22a12a21a11](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}

✒️
자명

연습 문제 2.4.3

다음 역행렬을 계산하라.

(1)

[2001]1(2.4.16)\begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}^{-1} \tag{2.4.16}

✒️
det = 2 이므로

[2001]1=[0.5001]\begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}^{-1} = \begin{bmatrix} 0.5 & 0 \\ 0 & 1 \end{bmatrix}

(2)

[12121212]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}

✒️
det = 1

[12121212]1=[12121212](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}

45°\degree회전변환을 나타내는 행렬의 역행렬은 -45°\degree회전변환을 나타낸다.

(3)

[3131221312]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}

✒️

[3131221312]1=265[1212213313]=[135135225325]\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}

(4)

[110011111]1(2.4.19)\begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 1 & 1 & 1 \\ \end{bmatrix}^{-1} \tag{2.4.19}

✒️
det = 0 + 1 + 0 = 1

[110011111]1=[011110111]\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}

연습 문제 2.4.4

두 정방행렬 A,BA,B에 대해서 AB=IAB = I이면 BA=IBA= I임을 증명하라.

AB=I        BA=I(2.4.20)AB = I \;\; \rightarrow \;\; BA = I \tag{2.4.20}

✒️

AB=IAB = I 에서 양변에 det를 취하면 det(AB)=det(A)det(B)=det(I)=1det(AB) =det(A)det(B)= det(I)=1 이므로
AA, BB의 행렬식 모두 0이 아니고, 따라서 역행렬이 존재한다.
역행렬의 정의에 의해 BA=IBA= I이 성립된다.

역행렬에 대한 정리

셔먼-모리슨(Sherman–Morrison) 공식

정방행렬 AA와 벡터 u,vu, v에 대해

(A+uvT)1=A1A1uvTA11+vTA1u(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}

우드베리(Woodbury) 공식

정방행렬 AA와 이에 대응하는 적절한 크기의 행렬 U,V,CU,V,C에 대해

(A+UCV)1=A1A1U(C1+VA1U)1VA1(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}

분할행렬의 역행렬

4개 블록(block)으로 분할된 행렬(partitioned matrix)의 역행렬은 각 분할행렬을 이용하여 계산할 수 있다.

[A11A12A21A22]1=[A111(I+A12FA111)A111A12FFA21A111F](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}

이 식에서 FF는 다음과 같이 주어진다.

F=(A22A21A111A12)1(2.4.24)F = (A_{22} - A_{21}A_{11}^{-1}A_{12})^{-1} \tag{2.4.24}

또는

F=(A11A12A221A21)1(2.4.25)F = (A_{11} - A_{12}A_{22}^{-1}A_{21})^{-1} \tag{2.4.25}

넘파이를 사용한 역행렬 계산

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.]])

역행렬과 선형 연립방정식의 해

A1A^{-1} 이 존재한다면 역행렬의 정의로부터 선형 연립방정식의 해는 다음처럼 구할 수 있다.

Ax=b(2.4.26)Ax = b \tag{2.4.26}
A1Ax=A1b(2.4.27)A^{-1}Ax = A^{-1}b \tag{2.4.27}
Ix=A1b(2.4.28)Ix = A^{-1}b \tag{2.4.28}
x=A1b(2.4.29)x = A^{-1}b \tag{2.4.29}
b = np.array([[2], [2], [3]])
b
array([[2],
       [2],
       [3]])
x = Ainv @ b
x
array([[1.],
       [1.],
       [1.]])

이 벡터를 원래의 연립방정식에 대입하여 상수벡터 bb와 값이 일치하는지 확인해보자.

A @ x - b
array([[0.],
       [0.],
       [0.]])

lstsq() 명령은 행렬 AAbb를 모두 인수로 받고 뒤에서 설명할 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() 명령을 사용하는 것을 권장한다.

선형 연립방정식과 선형 예측모형

x11w1+  x12w2  ++  x1NwN  =  y1x21w1+  x22w2  ++  x2NwN  =  y2                    xN1w1+  xN2w2  ++  xNNwN  =  yN(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}
Xw=y(2.4.31)Xw = y \tag{2.4.31}

이 예측 모형의 가중치벡터 ww를 찾는 것은 계수행렬이 XX, 미지수벡터가 ww, 상수벡터가 yy인 선형 연립방정식의 답을 찾는 것과 같다. 그리고 만약 계수행렬, 여기에서는 특징행렬 XX의 역행렬 X1X^{-1}이 존재하면 다음처럼 가중치벡터를 구할 수 있다.

w=X1y(2.4.32)w = X^{-1} y \tag{2.4.32}

연습 문제 2.4.5

보스턴 집값 문제를 선형 예측모형 Ax=b^Ax=\hat{b}로 풀었을 때의 가중치 벡터 xx를 구하라. 입력 데이터를 범죄율(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
# Load the Boston housing dataset from the original source
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]
# Assign data and target to X and y
X = data
y = target
# Extract the desired features and target values
A = X[:4, [0, 4, 5, 6]]  # 'CRIM', 'NOX', 'RM', 'AGE'
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
집이 오래되면 집 가격이 조금 떨어진다.

미지수의 수와 방정식의 수

지금까지는 미지수의 수와 방정식의 수가 같은 선형 연립방정식에 대해서만 생각했다. 그런데 만약 미지수의 수와 방정식의 수가 다르다면 어떻게 해야 할까?

미지수의 수와 방정식의 수를 고려해 볼 때 연립방정식에는 다음과 같은 세 종류가 있을 수 있다.

  1. 방정식의 수가 미지수의 수와 같다. (N=MN = M)

  2. 방정식의 수가 미지수의 수보다 적다. (N<MN < M)

  3. 방정식의 수가 미지수의 수보다 많다. (N>MN > M)

1번의 경우, 즉 방정식의 수가 미지수의 수와 같은 경우는 앞에서 다루었다.

2번의 경우, 즉 방정식의 수가 미지수의 수보다 적을 때는 무수히 많은 해가 존재할 수 있다.

3번의 경우, 즉 방정식의 수가 미지수의 수보다 많을 때는 해가 없을 수 있다.

선형 예측모형을 구하는 문제는 계수행렬이 특징행렬 XX, 미지수벡터가 가중치벡터 ww인 선형 연립방정식 문제이다. 그런데 보통 데이터의 수는 입력차원보다 큰 경우가 많다. 선형 연립방정식의 해가 존재하지 않으므로 선형 연립방정식을 푸는 방식으로는 선형 예측모형의 가중치벡터를 구할 수 없다.

최소자승문제

x1+x2=2x2+x3=2x1+x2+x3=3x1+x2+2x3=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}

이 선형 연립방정식의 해는 존재하지 않는다.

하지만 꼭 양변이 정확하게 똑같지 않아도 된다면 어떨까?

x1=x2=x3=1x_1 = x_2 = x_3 = 1를 위 방정식에 대입하면 결과는 다음과 같다.

x1+x2=2x2+x3=2x1+x2+x3=3x1+x2+2x3=44.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}

상당히 비슷하게 예측한 값이라고 할 수 있다.

미지수의 개수보다 방정식의 개수가 많아서 선형 연립방정식으로 풀수 없는 문제는 좌변과 우변의 차이를 최소화하는 문제로 바꾸어 풀 수 있다.

e=Axb(2.4.39)e = Ax - b \tag{2.4.39}

잔차는 벡터이므로 최소자승문제에서는 벡터의 크기 중에서 벡터의 놈(norm)을 최소화하는 문제를 푼다. 앞 절에서 놈을 최소화하는 것은 놈의 제곱을 최소화하는 것과 같다고 했다. 여기에서는 잔차제곱합이 놈의 제곱이 된다.

eTe=e2=(Axb)T(Axb)(2.4.40)e^Te = \Vert e \Vert^2 = (Ax-b)^T(Ax-b) \tag{2.4.40}

이 값을 최소화하는 xx값은 수식으로 다음처럼 표현한다.

x=argminxeTe=argminx  (Axb)T(Axb)(2.4.41)x = \text{arg} \min_x e^Te = \text{arg} \min_x \; (Ax-b)^T(Ax-b) \tag{2.4.41}

위 식에서 argminxf(x)\text{arg} \min_x f(x)는 함수 f(x)f(x)를 가장 작게 만드는 xx값을 의미한다.

이러한 문제를 최소자승문제(least square problem) 라고 한다.

Axb(2.4.42)Ax \approx b \tag{2.4.42}
ATAx=ATb(2.4.43)A^TAx = A^Tb \tag{2.4.43}

만약 정방 행렬 ATAA^TA의 역행렬 (ATA)1(A^TA)^{-1}이 존재한다면

(ATA)1(ATA)x=(ATA)1ATb(2.4.44)(A^TA)^{-1}(A^TA)x = (A^TA)^{-1}A^Tb \tag{2.4.44}
x=((ATA)1AT)b(2.4.45)x = ((A^TA)^{-1}A^T) b \tag{2.4.45}

(ATA)1AT(A^TA)^{-1}A^T 를 행렬 AA의사역행렬(pseudo inverse) 이라고 하며 A+A^{+} 로 표기한다.

A+=(ATA)1AT(2.4.46)A^{+} = (A^TA)^{-1}A^T \tag{2.4.46}
x=A+b(2.4.47)x = A^+ b \tag{2.4.47}

넘파이의 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=Axbe=Ax-b의 제곱합, 즉 놈의 제곱이다.

resid, np.linalg.norm(A @ x - b) ** 2
(array([0.00166667]), 0.001666666666666655)

연습 문제 2.4.6

보스턴 집값 문제를 선형 예측모형 Xw=y^Xw=\hat{y}로 풀었을 때의 가중치벡터 ww를 최소 자승 방법으로 구하라. 가중치 벡터의 각 원소의 부호가 우리의 직관이나 경험과 일치하는지 살펴보라. 또 연습문제 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
# Load the Boston housing dataset from the original source
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]
# Assign data and target to X and y
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
세금을 많이내는 지역일수록 집 값이 떨어진다.
profile
꾸준히 하기

0개의 댓글