Dạy học Linear Regression cho học sinh

Gồm: Lý thuyết chi tiết · Code Python · Mô phỏng cách code chạy

PHẦN 1

📘 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)
40900
601400
801800
1002300

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

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

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:

Đạo hàm của Loss theo w, b (không cần bắt buộc học sinh nhớ, chỉ hiểu ý):

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:

  1. Khởi tạo w, b (thường = 0 hoặc ngẫu nhiên nhỏ).
  2. Ở 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
  3. 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

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.

PHẦN 2

💻 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?

PHẦN 3

🧪 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