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.