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,)
# สำคัญ: ต้องเป็น 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()

ผลลัพธ์

การถดถอยเชิงเส้นด้วย PyTorch

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