<jupyter_start><jupyter_text>Linear Regression 선형회귀(Linear Regression)은 선형 상관 관계를 모델링 하는 기법으로 종속 변수 Y와 한 개 이상의 독립 젼수 X로 계산됨. 식은 아래와 같다. $$ H(x) = Wx + b $$ $$ cost(W, b) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 $$  정규 방정식을 사용한 선형회귀 계산 비용 함수를 최소화 하는 파라미터들(W, b)을 찾기 위한 해석적인 방법이 있을 바로 정규방정식 $$\theta = (X^T * X)^{-1}X^Ty$$<jupyter_code>import numpy as np
np.random.seed(1)
x =  3 * np.random.rand(100, 1)
y = 1 + 2*x + np.random.randn(100, 1)
# y = 1 + 2*x
import matplotlib.pyplot as plt
scatter = plt.scatter(x, y)
plt.xlabel('x')
plt.ylabel('y')

plt.show()<jupyter_output><empty_output><jupyter_text>정규방정식 해를 구함<jupyter_code>x_b = np.concatenate((np.ones((100, 1)), x), axis=1)
x_b.shape
x_b[:2]
theta = np.linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(y)
theta # 노이즈에 의해 완벽하게 파라미터가 나오진 않음<jupyter_output><empty_output><jupyter_text>구한 theta_hat에서부터 prediction<jupyter_code>x_test = np.array([[1], [2], [3], [4]])
x_test_b = np.concatenate((np.ones((len(x_test), 1)), x_test), axis=1)
x_test_b.shape
theta.shape
x_test_b.dot(theta)<jupyter_output><empty_output><jupyter_text>경사 하강법을 사용한 선형회귀 계산1 - sklearn사용 선형회귀에서 독립 변수 X가 많을 경우(특성수가 많을 경우)에는 정규방정식이 느리므로 SGD(경사 하강법)을 사용함<jupyter_code>from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)<jupyter_output><empty_output><jupyter_text>위에서 정규방정식을 사용한 결과와 같음<jupyter_code>lr.intercept_, lr.coef_
lr.predict(x_test)<jupyter_output><empty_output><jupyter_text>경사 하상법을 사용한 선형회귀 계산2 - pytorch<jupyter_code>import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)
model = LinearRegressionModel()
list(model.parameters())
# 데이터
x_train = torch.FloatTensor(x)
y_train = torch.FloatTensor(y)
# 모델 초기화
model = LinearRegressionModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=0.01)

nb_epochs = 1000
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    prediction = model(x_train)
    
    # cost 계산
    cost = F.mse_loss(prediction, y_train)
    
    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    # 100번마다 로그 출력
    if epoch % 100 == 0:
        params = list(model.parameters())
        W = params[0].item()
        b = params[1].item()
        print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
            epoch, nb_epochs, W, b, cost.item()
        ))<jupyter_output>Epoch    0/1000 W: 1.038, b: 0.243 Cost: 7.327103
Epoch  100/1000 W: 2.040, b: 0.968 Cost: 0.819576
Epoch  200/1000 W: 1.990, b: 1.061 Cost: 0.808259
Epoch  300/1000 W: 1.957, b: 1.122 Cost: 0.803406
Epoch  400/1000 W: 1.936, b: 1.162 Cost: 0.801325
Epoch  500/1000 W: 1.922, b: 1.188 Cost: 0.800432
Epoch  600/1000 W: 1.912, b: 1.205 Cost: 0.800049
Epoch  700/1000 W: 1.906, b: 1.216 Cost: 0.799885
Epoch  800/1000 W: 1.902, b: 1.223 Cost: 0.799815
Epoch  900/1000 W: 1.900, b: 1.228 Cost: 0.799785
Epoch 1000/1000 W: 1.898, b: 1.231 Cost: 0.799772
{'fraction_non_alphanumeric': 0.1567810195575505, 'fraction_numerical': 0.09490221224751523, 'mean_word_length': 3.785276073619632, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '94475', 'license': 'MIT', 'n_tokens_mistral': 1765, 'n_tokens_neox': 1762, 'n_words': 327, 'path': 'ML_prac/Linear_regression.ipynb', 'repo_name': 'IzPerfect/My-dictionary', 'size': '3119'}