Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Hồi quy tuyến tính với PyTorch

Về hồi quy tuyến tính

Cơ bản hồi quy tuyến tính đơn giản

  • Giúp hiểu mối quan hệ giữa hai biến liên tục
  • Ví dụ: x (độc lập) = cân nặng, y (phụ thuộc) = chiều cao
  • Phương trình: y = αx + β

Mục đích

  • Tối thiểu hóa khoảng cách giữa các điểm dữ liệu và đường hồi quy
  • Điều chỉnh hệ số α và chệch β

Xây dựng mô hình với PyTorch

Giả sử α = 2 và β = 1, phương trình: y = 2x + 1

1. Chuẩn bị dữ liệu

import numpy as np
import torch

# Tạo dữ liệu huấn luyện
x_values = [i for i in range(11)]  # [0, 1, 2, ..., 10]
x_train = np.array(x_values, dtype=np.float32).reshape(-1, 1)  # Shape: (11, 1)

y_values = [2*i + 1 for i in x_values]  # [1, 3, 5, ..., 21]
y_train = np.array(y_values, dtype=np.float32).reshape(-1, 1)  # Shape: (11, 1)

2. Xây dựng mô hình

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

class LinearRegModel(nn.Module):
    def __init__(self, input_size, output_size):
        super(LinearRegModel, self).__init__()
        self.linear = nn.Linear(input_size, output_size)
    
    def forward(self, x):
        return self.linear(x)

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

3. Huấn luyện

for epoch in range(epochs):
    epoch += 1
    
    # Chuyển numpy array sang torch Variable
    inputs = Variable(torch.from_numpy(x_train))
    labels = Variable(torch.from_numpy(y_train))
    
    # Xóa gradient
    optimizer.zero_grad()
    
    # Forward pass
    outputs = model(inputs)
    
    # Tính loss
    loss = criterion(outputs, labels)
    
    # Backward pass
    loss.backward()
    
    # Cập nhật tham số
    optimizer.step()
    
    print('epoch {}, loss {}'.format(epoch, loss.item()))

Kết quả huấn luyện

epoch 1, loss 276.74
epoch 2, loss 22.60
epoch 3, loss 1.87
...
epoch 100, loss 0.0103

Loss giảm đáng kể từ epoch 1 đến 100.

4. Vẽ đồ thị dự đoán

import matplotlib.pyplot as plt

# Dự đoán
predicted = model(Variable(torch.from_numpy(x_train))).data.numpy()

# Vẽ biểu đồ
plt.clf()
plt.plot(x_train, y_train, 'go', label='True data', alpha=0.5)
plt.plot(x_train, predicted, '--', label='Predictions', alpha=0.5)
plt.legend(loc='best')
plt.show()

Đồ thị cho thấy giá trị thực và dự đoán gần như trùng khớp hoàn toàn.