다중 선형 회귀
다수의 x로부터 y를 예측하는 회귀
독립 변수 x의 개수가 3개라면,
$$ H(x) = w_1x_1 + w_2x_2 + w_3x_3 + b$$
# 훈련 데이터
x1_train = torch.FloatTensor([[73], [93], [89], [96], [73]])
x2_train = torch.FloatTensor([[80], [88], [91], [98], [66]])
x3_train = torch.FloatTensor([[75], [93], [90], [100], [70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
# 가중치 w와 편향 b 초기화
w1 = torch.zeros(1, requires_grad=True)
w2 = torch.zeros(1, requires_grad=True)
w3 = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([w1, w2, w3, b], lr=1e-5)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = x1_train * w1 + x2_train * w2 + x3_train * w3 + b
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} w1: {:.3f} w2: {:.3f} w3: {:.3f} b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, w1.item(), w2.item(), w3.item(), b.item(), cost.item()
))
위 코드에선, x들과 w들을 일일히 선언해줌
벡터와 행렬 연산으로 바꾸면 더 효율적인 연산이 가능
행렬의 곱셈 과정에서 이루어지는 벡터 연산을 벡터의 내적(Dot Product)이라 함
1) 벡터 연산으로 이해하기
$$ H(X) = w_1x_1 + w_2x_2 + w_3x_3$$
위 식을 아래와 같이 두 벡터의 내적으로 표현 가능
두 벡터를 X, W로 표현한다면,
$$ H(X) = XW $$
x의 개수가 3개였음에도 이제는 X와 W라는 두 개의 변수로 표현 가능
2) 행렬 연산으로 이해하기
$$ \left(
\begin{array}{c}
x_{11}\ x_{12}\ x_{13}\ \\
x_{21}\ x_{22}\ x_{23}\ \\
x_{31}\ x_{32}\ x_{33}\ \\
x_{41}\ x_{42}\ x_{43}\ \\
x_{51}\ x_{52}\ x_{53}\ \\
\end{array}
\right)$$
왼쪽 표를 보고 오른쪽 행렬 X로 표현 가능
$$ \left(
\begin{array}{c}
x_{11}\ x_{12}\ x_{13}\ \\
x_{21}\ x_{22}\ x_{23}\ \\
x_{31}\ x_{32}\ x_{33}\ \\
x_{41}\ x_{42}\ x_{43}\ \\
x_{51}\ x_{52}\ x_{53}\ \\
\end{array}
\right)
\left(
\begin{array}{c}
w_{1} \\
w_{2} \\
w_{3} \\
\end{array}
\right)
\ =
\left(
\begin{array}{c}
x_{11}w_{1}+ x_{12}w_{2}+ x_{13}w_{3}\ \\
x_{21}w_{1}+ x_{22}w_{2}+ x_{23}w_{3}\ \\
x_{31}w_{1}+ x_{32}w_{2}+ x_{33}w_{3}\ \\
x_{41}w_{1}+ x_{42}w_{2}+ x_{43}w_{3}\ \\
x_{51}w_{1}+ x_{52}w_{2}+ x_{53}w_{3}\ \\
\end{array}
\right) $$
-> $$ H(X) = XW$$
$$\left(
\begin{array}{c}
x_{11}\ x_{12}\ x_{13}\ \\
x_{21}\ x_{22}\ x_{23}\ \\
x_{31}\ x_{32}\ x_{33}\ \\
x_{41}\ x_{42}\ x_{43}\ \\
x_{51}\ x_{52}\ x_{53}\ \\
\end{array}
\right)
\left(
\begin{array}{c}
w_{1} \\
w_{2} \\
w_{3} \\
\end{array}
\right)
+
\left(
\begin{array}{c}
b \\
b \\
b \\
b \\
b \\
\end{array}
\right)
\ =
\left(
\begin{array}{c}
x_{11}w_{1}+ x_{12}w_{2}+ x_{13}w_{3} + b\ \\
x_{21}w_{1}+ x_{22}w_{2}+ x_{23}w_{3} + b\ \\
x_{31}w_{1}+ x_{32}w_{2}+ x_{33}w_{3} + b\ \\
x_{41}w_{1}+ x_{42}w_{2}+ x_{43}w_{3} + b\ \\
x_{51}w_{1}+ x_{52}w_{2}+ x_{53}w_{3} + b\ \\
\end{array}
\right)$$
최종 식 $$ H(X) = XW + B $$
Reference
'전공 > 머신러닝' 카테고리의 다른 글
[ML] 원핫인코딩(One-Hot Encoding) (0) | 2024.11.20 |
---|---|
[ML] 로지스틱 회귀 (Logistic Regression) (0) | 2024.11.09 |
[ML] 피쳐(Featrue)와 샘플(Sample)의 차이 (0) | 2024.11.07 |
[ML] 선형 회귀와 자동 미분 (0) | 2024.11.07 |
[ML] K-NN(K-Neighbor Nearest)이란? (0) | 2024.04.02 |