하나의 독립변수 x와 가중치 w(weigth) 그리고 편향 b (bias)를 통해서 종속변수 y값을 찾아내는 식이다.
하지만, 다변량 선형회귀는 이 독립변수를 여러개 사용하는 선형회귀라고 할 수 있다.
다변량 선형회귀
예를 들어보자 ( 집값을 구하는 예 )
예를 들어서, 집값을 예측하는 함수를 만들어 본다고 가정을 하자.
집값을 예측할 때는 다양한 데이터들이 사용될 수 있다.
집이 속한 지역구의 부의 수준, 편의시설의 수, 기반시설의 수 등 다양한 데이터들이 집값에 영향을 줄 수 있다.
이 때, 예를들어 편의시설의 수 만을 이용해서 집값에 대한 그래프를 그리게 되면하, 하나의 독립변수 ( 편의시설의 수)로 종속변수( 집값)의 그래프를 그리게 된다.
이 경우를 단순 선형회귀 라고 한다.
더 나아가 편의시설의 수 만이 아니라, 기반시설의 수 , 지역구의 부의 수준 등의 데이터를 더 넣어서 그래프를 그리게 된다면, 여러개의 독립변수 ( 편의시설의 수 , 기반시설의 수 , 지역구의 부의 수준 ) 을 이용해서 하나의 종속변수 ( 집값 )에 대한 그래프를 그리게 된다.
이 경우를 다변량 선형회귀 라고 한다.
즉, 여러개의 변수를 사용하여 선형회귀를 하는것이다.
식을 통해 알아보자
그렇다면 다변량 선형회귀에 대한 식은 어떻게 생겼을까.
위의 예제를 참고하여 식을 세워 보면
이렇게 적을 수 있겠다. 이를 행렬로 전환하여,
다음과 같이 표기하면, 식을 간단히 아래와 같이 간단히 적을 수 있다.
W, b를 구하는것은, 단순 선형회귀때와 마찬가지로 최소제곱법, 경사하강법 등을 통해서 구할 수 있다.
코드와 그래프를 통해서 알아보자
"""
여기서는 두개의 종속변수 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()