เกี่ยวกับการถดถอยเชิงเส้น
พื้นฐานการถดถอยเชิงเส้นแบบง่าย
- ช่วยเข้าใจความสัมพันธ์ระหว่างตัวแปรต่อเนื่องสองตัว
- ตัวอย่าง:
- 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()
ผลลัพธ์

วัตถุประสงค์ของการถดถอยเชิงเส้น:
- ลดระยะห่างระหว่างจุดข้อมูลและเส้น (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,)
# สำคัญ: ต้องเป็น 2D 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]
# วนลูปแบบรายการ
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 y_train = y_train.reshape(-1, 1) y_train.shape
ผลลัพธ์
(11, 1)
การสร้างโมเดล
# นำเข้าไลบรารี
import torch
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_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
# แปลง numpy array เป็น torch variable
inputs = Variable(torch.from_numpy(x_train))
labels = Variable(torch.from_numpy(y_train))
# ล้าง gradient เกี่ยวกับพารามิเตอร์
optimizer.zero_grad()
# Forward เพื่อรับ output
outputs = model.forward(inputs)
# คำนวณ Loss
loss = criterion(outputs, labels)
# รับ gradient เกี่ยวกับพารามิเตอร์
loss.backward()
# อัปเดตพารามิเตอร์
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
可看到 loss ลดลงอย่างมากจาก epoch 1 ถึง epoch 100
พล็อตกราฟ
# การอนุมานอย่างเดียว predicted = model(Variable(torch.from_numpy(x_train))).data.numpy() # ล้างรูป plt.clf() # รับการทำนาย predicted = model(Variable(torch.from_numpy(x_train))).data.numpy() # พล็อตข้อมูลจริง plt.plot(x_train, y_train, 'go', label='True data', alpha=0.5) # พล็อตการทำนาย plt.plot(x_train, predicted, '--', label='Predictions', alpha=0.5) # Legend และพล็อต plt.legend(loc='best') plt.show()
ผลลัพธ์

จากกราฟเห็นว่า ค่าจริงและค่าทำนายเกือบเหมือนกัน