Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

PyTorch를 사용한 선형 회귀?

<시간/>

선형 회귀 정보

단순 선형 회귀의 기초

  • 두 개의 연속 변수 간의 관계를 이해할 수 있습니다.

  • 예 -

    • x =독립변수

      • 무게

    • y =종속변수

      • 높이

  • y =αx + β

프로그램을 통해 단순 선형 회귀를 이해합시다 -

#Simple linear regression

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)
n = 70
x = np.random.randn(n)
y = x * np.random.randn(n)

colors = np.random.rand(n)
plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)))

plt.scatter(x, y, c = colors, alpha = 0.5)
plt.show()

출력

PyTorch를 사용한 선형 회귀?

선형 회귀의 목적:

  • 점과 선 사이의 거리를 최소화(y =αx + β)

  • 조정

    • 계수:α

    • 가로채기/편향:β

PyTorch로 선형 회귀 모델 구축

계수(α)가 2이고 절편(β)이 1이라고 가정하면 방정식은 -

가 됩니다.

y =2x +1 #선형 모델

데이터세트 구축

x_values = [i for i in range(11)]
x_values

출력

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#numpy로 변환

x_train = np.array(x_values, dtype = np.float32)
x_train.shape

출력

(11,)
#Important: 2D required
x_train = x_train.reshape(-1, 1)
x_train.shape

출력

(11, 1)
y_values = [2*i + 1 for i in x_values]
y_values

출력

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
#list iteration

y_values = []
for i in x_values:
result = 2*i +1
y_values.append(result)

y_values

출력

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
y_train = np.array(y_values, dtype = np.float32)
y_train.shape

출력

(11,)
#2D required
y_train = y_train.reshape(-1, 1)
y_train.shape

출력

(11, 1)

건물 모델

#import libraries
import torch
import torch.nn as nn
from torch.autograd import Variable

#Create Model class
class LinearRegModel(nn.Module):
def __init__(self, input_size, output_size):
super(LinearRegModel, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)

def forward(self, x):
out = self.linear(x)
return out

input_dim = 1
output_dim = 1

model = LinearRegModel(input_dim, output_dim)

criterion = nn.MSELoss()

learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)

epochs = 100
for epoch in range(epochs):
epoch += 1
#convert numpy array to torch variable
inputs = Variable(torch.from_numpy(x_train))
labels = Variable(torch.from_numpy(y_train))

#Clear gradients w.r.t parameters
optimizer.zero_grad()

#Forward to get output
outputs = model.forward(inputs)

#Calculate Loss
loss = criterion(outputs, labels)

#Getting gradients w.r.t parameters
loss.backward()

#Updating parameters
optimizer.step()

print('epoch {}, loss {}'.format(epoch, loss.data[0]))
업데이트 중

출력

epoch 1, loss 276.7417907714844
epoch 2, loss 22.601360321044922
epoch 3, loss 1.8716105222702026
epoch 4, loss 0.18043726682662964
epoch 5, loss 0.04218350350856781
epoch 6, loss 0.03060017339885235
epoch 7, loss 0.02935197949409485
epoch 8, loss 0.02895027957856655
epoch 9, loss 0.028620922937989235
epoch 10, loss 0.02830091118812561
......
......
epoch 94, loss 0.011018744669854641
epoch 95, loss 0.010895680636167526
epoch 96, loss 0.010774039663374424
epoch 97, loss 0.010653747245669365
epoch 98, loss 0.010534750297665596
epoch 99, loss 0.010417098179459572
epoch 100, loss 0.010300817899405956

따라서 손실을 Epoch 1에서 Epoch 100으로 상당히 줄일 수 있습니다.

그래프 그리기

#Purely inference
predicted = model(Variable(torch.from_numpy(x_train))).data.numpy()
predicted
y_train

#Plot Graph

#Clear figure
plt.clf()

#Get predictions
predicted = model(Variable(torch.from_numpy(x_train))).data.numpy()

#Plot true data
plt.plot(x_train, y_train, 'go', label ='True data', alpha = 0.5)

#Plot predictions
plt.plot(x_train, predicted, '--', label='Predictions', alpha = 0.5)

#Legend and Plot
plt.legend(loc = 'best')
plt.show()

출력

PyTorch를 사용한 선형 회귀?

그래서 우리는 그래프에서 우리의 실제 값과 예측 값이 거의 비슷할 수 있습니다.