📘 Lý thuyết chi tiết về Linear Regression
1. Mục tiêu của bài toán
Linear Regression (hồi quy tuyến tính) được dùng để dự đoán một giá trị số. Ví dụ điển hình: dự đoán giá nhà dựa trên diện tích.
Giả sử ta có dữ liệu:
| Diện tích (m²) | Giá (triệu) |
|---|---|
| 40 | 900 |
| 60 | 1400 |
| 80 | 1800 |
| 100 | 2300 |
Câu hỏi: Nếu có một căn nhà 50 m² thì giá sẽ khoảng bao nhiêu?
→ Đó chính là nhiệm vụ của Linear Regression.
2. Mô hình: đường thẳng y = w·x + b
Ta giả sử mối quan hệ giữa diện tích (x) và giá (y) gần như là đường thẳng:
y = w × x + b
- x: diện tích nhà (m²)
- y: giá nhà (triệu)
- w: độ dốc (tăng thêm 1 m² thì giá tăng ~ bao nhiêu triệu)
- b: giá “cơ bản” khi x = 0 (giao điểm với trục y)
3. Hàm mất mát (Loss) – MSE
Không thể có đường thẳng đi qua chính xác tất cả các điểm dữ liệu,
nên ta cần một cách đo xem đường thẳng hiện tại “tệ” hay “tốt”.
Thường dùng MSE (Mean Squared Error):
MSE = (1/n) · Σ (y_dự_đoán − y_thật)2
- n: số mẫu dữ liệu (ở đây n = 4)
y_dự_đoán = w·x + by_thật: giá trị trong bảng dữ liệu
Mục tiêu: Tìm bộ (w, b) làm cho MSE nhỏ nhất.
4. Đạo hàm và Gradient
Ý tưởng: Nếu ta coi MSE là một “ngọn núi” hoặc “thung lũng” theo hai biến w và b, thì ta muốn đi đến điểm thấp nhất (MSE nhỏ nhất).
Gradient (∂L/∂w, ∂L/∂b) cho ta biết:
- Hướng mà MSE tăng nhanh nhất.
- Nếu ta đi ngược hướng gradient thì MSE sẽ giảm.
Đạo hàm của Loss theo w, b (không cần bắt buộc học sinh nhớ, chỉ hiểu ý):
- ∂L/∂w = (2/n) · Σ (w·xi + b − yi)·xi
- ∂L/∂b = (2/n) · Σ (w·xi + b − yi)
5. Gradient Descent – thuật toán học w, b
Gradient Descent là cách ta từng bước cập nhật w, b để giảm MSE:
- Khởi tạo w, b (thường = 0 hoặc ngẫu nhiên nhỏ).
- Ở mỗi vòng lặp (epoch):
- Tính gradient: ∂L/∂w, ∂L/∂b.
- Cập nhật:
w ← w − learning_rate · ∂L/∂w
b ← b − learning_rate · ∂L/∂b - Lặp lại nhiều lần cho đến khi MSE gần như không giảm nữa.
6. Ý nghĩa learning_rate và epochs
- learning_rate: Bước đi mỗi lần cập nhật (đi nhanh hay chậm).
- epochs: Số lần lặp (số “bước chân” ta đi xuống thung lũng).
Trong phần code phía dưới, ta sẽ cho học sinh nhìn thấy w, b thay đổi theo thời gian và xem mã Python hoạt động như thế nào.
💻 Code Python cho học sinh (có thể copy và chạy)
Dưới đây là các khối code Python từ dễ đến khó. Học sinh có thể copy và chạy trên VS Code hoặc Google Colab.
2.1. Tạo dữ liệu mẫu
Đoạn code này chỉ tạo dữ liệu và in ra cho học sinh làm quen:
# Dữ liệu mẫu: diện tích (m2) và giá (triệu)
X = [40, 60, 80, 100]
y = [900, 1400, 1800, 2300]
print("Diện tích:", X)
print("Giá nhà:", y)
2.2. Linear Regression từ đầu bằng Gradient Descent
Đây là phần chính: ta tự viết thuật toán để máy tính tự học w, b sao cho phù hợp dữ liệu.
# Linear Regression từ đầu bằng Gradient Descent
# 1. Dữ liệu
X = [40, 60, 80, 100]
y = [900, 1400, 1800, 2300]
# 2. Khởi tạo tham số mô hình
w = 0.0
b = 0.0
# 3. Siêu tham số
learning_rate = 0.00001
epochs = 50000
n = len(X)
# 4. Vòng lặp học
for epoch in range(epochs):
dw = 0.0
db = 0.0
# tính gradient
for i in range(n):
y_pred = w * X[i] + b
error = y_pred - y[i]
dw += error * X[i]
db += error
dw = (2 / n) * dw
db = (2 / n) * db
# cập nhật w, b
w -= learning_rate * dw
b -= learning_rate * db
# in ra vài epoch để theo dõi
if epoch % 5000 == 0:
print(f"Epoch {epoch}: w={w:.4f}, b={b:.4f}")
print("Kết quả cuối cùng:")
print("w =", w)
print("b =", b)
2.3. Hàm dự đoán giá nhà
Sau khi đã học được w, b, ta viết thêm hàm predict() để dự đoán giá nhà theo diện tích.
# Hàm dự đoán giá nhà theo diện tích, dùng w, b đã học được
def predict(area, w, b):
return w * area + b
# Ví dụ: nếu đã học xong w, b ở trên,
# ta có thể gọi:
test_area = 50
pred_price = predict(test_area, w, b)
print(f"Dự đoán giá nhà {test_area}m2 ≈ {pred_price:.2f} triệu")
Gợi ý khi dạy: cho học sinh tự thay đổi learning_rate, epochs
trong code 2.2 để xem:
– Học chậm/quá nhanh thì chuyện gì xảy ra?
– Kết quả w, b có ổn định không?
🧪 Mô phỏng xem code chạy như thế nào
Phần này dùng JavaScript nhưng logic giống 100% với code Python ở trên, giúp học sinh thấy w, b thay đổi theo thời gian và cách Gradient Descent hoạt động.
Demo trực quan