# 4. 다변량 선형 회귀

날짜: 2023년 3월 6일 발표자: 비오규 태그: 세미나

## 목차

***

1. 단순 선형회귀
2. 다변량 선형회귀
   1. 예를 들어보자 ( 집값을 구하는 예 )
   2. 식을 통해 알아보자
   3. 코드와 그래프를 통해서 알아보자

## 단순 선형회귀

***

기존의 일반적인 선형회귀는 다음과 같은 식을 이용한다.

$$
y = wx + b
$$

하나의 독립변수 x와 가중치 w(weigth) 그리고 편향 b (bias)를 통해서 종속변수 y값을 찾아내는 식이다.

하지만, 다변량 선형회귀는 이 독립변수를 여러개 사용하는 선형회귀라고 할 수 있다.

## 다변량 선형회귀

***

### 예를 들어보자 ( 집값을 구하는 예 )

***

예를 들어서, 집값을 예측하는 함수를 만들어 본다고 가정을 하자.

집값을 예측할 때는 다양한 데이터들이 사용될 수 있다.

집이 속한 `지역구의 부의 수준`, `편의시설의 수`, `기반시설의 수` 등 다양한 데이터들이 집값에 영향을 줄 수 있다.

이 때, 예를들어 `편의시설의 수` 만을 이용해서 집값에 대한 그래프를 그리게 되면하, 하나의 독립변수 ( `편의시설의 수`)로 종속변수( `집값`)의 그래프를 그리게 된다.

이 경우를 `단순 선형회귀` 라고 한다.

더 나아가 `편의시설의 수` 만이 아니라, `기반시설의 수` , `지역구의 부의 수준` 등의 데이터를 더 넣어서 그래프를 그리게 된다면, 여러개의 독립변수 ( `편의시설의 수` , `기반시설의 수` , `지역구의 부의 수준` ) 을 이용해서 하나의 종속변수 ( `집값` )에 대한 그래프를 그리게 된다.

이 경우를 `다변량 선형회귀` 라고 한다.

즉, 여러개의 변수를 사용하여 선형회귀를 하는것이다.

### 식을 통해 알아보자

***

그렇다면 다변량 선형회귀에 대한 식은 어떻게 생겼을까.

위의 예제를 참고하여 식을 세워 보면

$$
y = {w\_{편의시설의\space수}}{x\_{편의시설의\space수}} + {w\_{기반시설의\space수}}{x\_{기반시설의\space수}} + {w\_{지역구\space부의\space수준}}{x\_{지역구\space부의\space수준}} + b
$$

이렇게 적을 수 있겠다. 이를 행렬로 전환하여,

$$
W = \begin{pmatrix} w\_{{편의시설의\space수}} \ w\_{{기반시설의\space수}} \ w\_{지역구\space부의\space수준} \end{pmatrix}, X = \begin{pmatrix} x\_{{편의시설의\space수}} & x\_{{기반시설의\space수}} & x\_{지역구\space부의\space수준} \end{pmatrix}
$$

다음과 같이 표기하면, 식을 간단히 아래와 같이 간단히 적을 수 있다.

$$
y = X{\cdot}W + b
$$

> W, b를 구하는것은, 단순 선형회귀때와 마찬가지로 최소제곱법, 경사하강법 등을 통해서 구할 수 있다.

### 코드와 그래프를 통해서 알아보자

***

```python
"""
여기서는 두개의 종속변수 X1, X2를 사용하여
Y의 값에 대한 선형회귀를 해볼 것이다. 
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.linear_model import LinearRegression

# 랜덤하게 데이터를 생성한다. 
# (X1, X2의 값을 생성후, Y의 값을 X1, X2에 적절한 값을 곱한후 더하고, 랜덤한 값을 정해 더해준다)
np.random.seed(0)
X1 = np.linspace(0, 100, 100)
X2 = np.linspace(50, 0, 100)
Y = 2*X1 + 3*X2 + 5*np.random.randn(100)

# Create a pandas DataFrame
data = pd.DataFrame({'X1': X1, 'X2': X2, 'Y': Y})

# 선형회귀 모델을 불러와서 선형회귀를 실시한다.
# 모델 내의 선형회귀 방법을 사용한다. scikit-learn에서는 최소제곱법을 이용해서 선형회귀를 실시한다.
model = LinearRegression()
X = data[['X1', 'X2']]
model.fit(X, Y)

# 3D 그래프를 그린다.
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['X1'], data['X2'], data['Y'], c='red', marker='o')
ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('Y')
ax.view_init(0, 90)

# Plot the regression plane
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
X1, X2 = np.meshgrid(np.linspace(x_min, x_max, 10),
                     np.linspace(y_min, y_max, 10))
Y = model.intercept_ + model.coef_[0]*X1 + model.coef_[1]*X2
ax.plot_surface(X1, X2, Y, alpha=0.2)

plt.show()
```

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FMxA2fCRvzjWchg8JjEAO%2FFigure_1.png?alt=media&#x26;token=c8781427-284e-4e16-9cf0-6134f6992933" alt=""><figcaption></figcaption></figure>
