Linear regression

Định giá căn hộ từ diện tích và khoảng cách

Chương 2 · Bài 2.1

2

Giá này cao hay thấp?

Một căn hộ 70 m², cách trung tâm 8 km, rao bán 4,2 tỷ.

Có giá của 200 căn đã bán quanh đó (dữ liệu giả lập).

Căn rộng hơn thì đắt hơn, xa trung tâm thì rẻ hơn.

Linear regression viết cách ước lượng ấy thành công thức và tìm hệ số từ dữ liệu.

3

Mục tiêu

  • Hiểu model tuyến tính và ý nghĩa từng hệ số.
  • Tìm hệ số bằng công thức nghiệm và bằng gradient descent.
  • Biết vì sao learning rate quá lớn làm loss tăng vọt, và vì sao cần chuẩn hóa đặc trưng.
  • Dùng scikit-learn và tự cài lại bằng NumPy.
01

Dữ liệu và mô hình

Dữ liệu và mô hình5

Mô hình tuyến tính

Mỗi đặc trưng đóng góp một lượng tỉ lệ với nó, rồi cộng lại:

y^=w1x1+⋯+wdxd+b=w⊤x+b\hat{y} = w_1 x_1 + \dots + w_d x_d + b = \mathbf{w}^\top \mathbf{x} + b

wjw_j: dự đoán tăng bao nhiêu khi xjx_j tăng 1 đơn vị và các đặc trưng khác giữ nguyên.

Cho cả nn mẫu cùng lúc:

y^=Xw+b\hat{\mathbf{y}} = X\mathbf{w} + b
Ký hiệu Shape
XX (n, d)
w\mathbf{w} (d,)
y^\hat{\mathbf{y}}, y\mathbf{y} (n,)
Dữ liệu và mô hình6

Dữ liệu của buổi học

Tự sinh 200 căn theo một công thức biết trước, cộng nhiễu:

giaˊ=0.05⋅diện tıˊch−0.15⋅khoảng caˊch+1\text{giá} = 0.05 \cdot \text{diện tích} - 0.15 \cdot \text{khoảng cách} + 1

Biết trước đáp án thì kiểm tra được mô hình học đúng hay sai.

rng = np.random.default_rng(0)
n = 200
area = rng.uniform(30, 120, n)
dist = rng.uniform(1, 15, n)
y = 0.05 * area - 0.15 * dist + 1.0 \
    + rng.normal(0, 0.3, n)
X = np.column_stack([area, dist])
print(X.shape, y.shape)
Kết quả(200, 2) (200,)
Dữ liệu và mô hình7

Hỏi nhanh

X có shape (200, 2), w có shape (2,). X @ w + b có shape gì?

02

Hàm mất mát

Hàm mất mát9

Mean squared error

J(w,b)=1n∑i=1n(y^i−yi)2J(\mathbf{w}, b) = \frac{1}{n}\sum_{i=1}^{n}\left(\hat y_i - y_i\right)^2

Vì sao bình phương?

  • Trơn, đạo hàm được ở mọi điểm.
  • Phạt lỗi lớn nặng hơn: sai 10 bị phạt gấp 4 lần sai 5.
  • Nếu phần nhiễu độc lập, trung bình bằng 0 và có cùng phương sai theo điều kiện trên đặc trưng, MSE tương ứng với maximum likelihood dưới giả định Gaussian.

Nhược điểm: nhạy với outlier.

Hàm mất mát10

Phần dư trên một đường thẳng

Phần dư là đoạn thẳng đứng từ điểm dữ liệu tới đường dự đoán.048120246810xŷ = wx + bphần dư
Phần dư là đoạn thẳng đứng từ điểm dữ liệu tới đường dự đoán.
Hàm mất mát11

Mốc so sánh

Mô hình đoán mọi căn bằng giá trung bình có

MSE=Var⁡(y)=2.34\text{MSE} = \operatorname{Var}(y) = 2.34

Trên cùng tập chấm, mô hình có MSE lớn hơn mốc này chưa cải thiện sai số so với dự đoán hằng số.

R2=1−MSEVar⁡(y)R^2 = 1 - \frac{\text{MSE}}{\operatorname{Var}(y)}

R2=0R^2 = 0: ngang mốc · R2=1R^2 = 1: đoán trúng hết

Hàm mất mát12

Hỏi nhanh

Đổi đơn vị giá từ tỷ đồng sang triệu đồng, tức nhân mọi yy với 1000. MSE thay đổi thế nào?

03

Nghiệm đóng

Nghiệm đóng14

Phương trình chuẩn

Thêm cột 1 vào XX: X~=[X    1]\tilde X = [X \;\; \mathbf{1}], gộp θ=(w,b)\boldsymbol\theta = (\mathbf{w}, b), khi đó y^=X~θ\hat{\mathbf{y}} = \tilde X\boldsymbol\theta.

Cực tiểu của JJ là nơi gradient bằng 0:

∇J(θ)=2nX~⊤(X~θ−y)=0⟺X~⊤X~ θ=X~⊤y\nabla J(\boldsymbol\theta) = \frac{2}{n}\tilde X^\top(\tilde X\boldsymbol\theta - \mathbf{y}) = \mathbf{0} \quad\Longleftrightarrow\quad \tilde X^\top \tilde X\,\boldsymbol\theta = \tilde X^\top \mathbf{y}

Nếu các cột của X~\tilde X độc lập, hệ có nghiệm duy nhất và có thể giải bằng np.linalg.solve. Với hệ suy biến hoặc điều kiện kém, dùng lstsq/QR/SVD thay cho nghịch đảo ma trận.

Nghiệm đóng15

Giải trên dữ liệu căn hộ

Xb = np.column_stack([X, np.ones(n)])
theta = np.linalg.solve(Xb.T @ Xb, Xb.T @ y)
w_cf, b_cf = theta[:2], theta[2]
print(w_cf.round(4), round(b_cf, 4))
print(mse(predict(X, w_cf, b_cf), y))
print(predict(np.array([70, 8]), w_cf, b_cf))
Kết quả[ 0.0499 -0.1453] 0.9809
0.08807615180405967
3.309815169606732
  • Hệ số ≈(0.05, −0.15, 1)\approx (0.05,\ -0.15,\ 1): khôi phục đúng công thức sinh dữ liệu.
  • MSE 0.088≈0.320.088 \approx 0.3^2: nhiễu độc lập không dự đoán được cho căn mới; train noise vẫn có thể bị học thuộc.
  • Căn 70 m², 8 km: mô hình định giá 3,3 tỷ. Rao 4,2 tỷ là cao hơn 0,9 tỷ.
Nghiệm đóng16

Cách nhìn hình học

y\mathbf{y} là một vector trong không gian nn chiều. Mọi dự đoán X~θ\tilde X\boldsymbol\theta nằm trên mặt phẳng sinh bởi các cột của X~\tilde X.

Least squares chọn hình chiếu vuông góc của y\mathbf{y} lên mặt phẳng đó.

Phần dư vuông góc với mọi cột, kể cả cột số 1, nên tổng phần dư bằng 0.

Nghiệm đóng17

Hình chiếu vuông góc

Least squares chiếu y vuông góc xuống mặt phẳng các dự đoán.mọi dự đoán Xθyŷphần dư ⟂ mặt phẳng
Least squares chiếu y vuông góc xuống mặt phẳng các dự đoán.
Nghiệm đóng18

Hỏi nhanh

Thêm vào X một cột “diện tích tính bằng dm²”, đúng bằng 100 lần cột diện tích. Nghiệm đóng sẽ ra sao?

04

Gradient descent

Gradient descent20

Đi xuống trong sương mù

Không thấy đáy, chỉ cảm nhận độ dốc dưới chân: bước một bước nhỏ về phía dốc xuống, rồi lặp lại.

Với ri=y^i−yir_i = \hat y_i - y_i:

∂J∂w=2nX⊤r,∂J∂b=2n∑iri\frac{\partial J}{\partial \mathbf{w}} = \frac{2}{n} X^\top \mathbf{r}, \qquad \frac{\partial J}{\partial b} = \frac{2}{n}\sum_i r_i w←w−η ∂J∂w,b←b−η ∂J∂b\mathbf{w} \leftarrow \mathbf{w} - \eta\,\frac{\partial J}{\partial \mathbf{w}}, \qquad b \leftarrow b - \eta\,\frac{\partial J}{\partial b}
def grad(theta, X, y):
    weights = theta[:-1]
    bias = theta[-1]
    residual = predict(X, weights, bias) - y
    grad_weights = 2 * (X.T @ residual) / len(y)
    grad_bias = 2 * residual.mean()
    return np.append(grad_weights, grad_bias)

gd lặp: ghi loss, rồi theta -= lr * grad(...).

Gradient descent21

Hỏi nhanh

Đặt r = y_hat - y. Dòng nào cập nhật bias đúng?

Gradient descent22

Bài tập trên lớp: ba điểm

Ba điểm (1,2)(1, 2), (2,3)(2, 3), (3,5)(3, 5).

  1. Tìm đường least squares y^=wx+b\hat y = wx + b.
  2. Từ w=b=0w = b = 0, η=0.1\eta = 0.1, làm một bước gradient descent.

Công thức cho một đặc trưng:

w=∑(xi−xˉ)(yi−yˉ)∑(xi−xˉ)2,b=yˉ−wxˉw = \frac{\sum (x_i - \bar x)(y_i - \bar y)}{\sum (x_i - \bar x)^2}, \qquad b = \bar y - w \bar x
Gradient descent23

Lời giải

xˉ=2\bar x = 2, yˉ=10/3\bar y = 10/3, tử số =3= 3, mẫu số =2= 2:

w=1.5,b=13,J=0.056w = 1.5, \qquad b = \tfrac{1}{3}, \qquad J = 0.056

Tại w=b=0w = b = 0: r=(−2,−3,−5)r = (-2, -3, -5),

∂J∂w=−463,∂J∂b=−203\frac{\partial J}{\partial w} = -\frac{46}{3}, \qquad \frac{\partial J}{\partial b} = -\frac{20}{3}

Sau một bước: w=1.53w = 1.53, b=0.67b = 0.67, loss từ 12.6712.67 xuống 0.220.22.

Gradient descent24

Một bước đã gần nghiệm đóng

Ba điểm: nghiệm đóng và đường sau một bước gradient descent.024601234(1, 2)(2, 3)(3, 5)ŷ = 1.5x + 1/3nghiệm least squares, J = 0.056ŷ = 1.53x + 0.67sau 1 bước GD từ 0, J = 0.22
Ba điểm: nghiệm đóng và đường sau một bước gradient descent.
Gradient descent25

Kiểm tra gradient

Xấp xỉ đạo hàm chỉ bằng hàm loss, như viết code trâu để đối chiếu:

∂J∂θj≈J(θ+hej)−J(θ−hej)2h\frac{\partial J}{\partial \theta_j} \approx \frac{J(\boldsymbol\theta + h\mathbf{e}_j) - J(\boldsymbol\theta - h\mathbf{e}_j)}{2h}

Sai số O(h2)O(h^2), chọn h≈10−5h \approx 10^{-5}.

Phiên bản grad Sai số tương đối
Đúng 7⋅10−137 \cdot 10^{-13}
Quên hệ số 2 0.3330.333

Sai số nhỏ xác nhận đạo hàm tại điểm đã kiểm. Kiểm vài điểm và thang bước sai phân; bước quá nhỏ có thể tăng sai số số học.

Gradient descent26

Hỏi nhanh

Vì sao ta dùng sai phân trung tâm J(θ+h)−J(θ−h)2h\frac{J(\theta + h) - J(\theta - h)}{2h} thay vì J(θ+h)−J(θ)h\frac{J(\theta + h) - J(\theta)}{h}?

05

Learning rate và chuẩn hóa

Learning rate và chuẩn hóa28

Thử ba learning rate

for lr in [1e-3, 2e-4, 1e-4]:
    theta_gd, hist = gd(X, y, lr, 1000)
    print(f"lr = {lr:g}: loss sau 1000 vòng = {hist[-1]:.4g}")
Kết quảlr = 0.001: loss sau 1000 vòng = nan
lr = 0.0002: loss sau 1000 vòng = inf
lr = 0.0001: loss sau 1000 vòng = 0.1541
  • Hai giá trị đầu: loss nổ tung.
  • 10−410^{-4}: hội tụ nhưng rất chậm; sau 1000 vòng, bb mới đi được 0.010.01 trên đường tới 0.980.98.

Có đoán trước được không?

Learning rate và chuẩn hóa29

Ngưỡng của learning rate

Hessian của JJ là hằng số H=2nX~⊤X~H = \frac{2}{n}\tilde X^\top\tilde X. Mỗi bước nhân sai số theo hướng ứng với trị riêng λ\lambda với (1−ηλ)(1 - \eta\lambda), nên cần

0<η<2λmax⁡0<\eta < \frac{2}{\lambda_{\max}}

Dữ liệu căn hộ: ngưỡng =1.43⋅10−4= 1.43 \cdot 10^{-4}, số điều kiện κ=λmax⁡/λmin⁡≈105\kappa = \lambda_{\max}/\lambda_{\min} \approx 10^5.

Learning rate và chuẩn hóa30

Bước vừa phải và bước quá lớn

Bước vừa phải đi dần về đáy; bước quá lớn vượt đáy rồi văng xa dần.η = 0.3tiến dần về đáyη = 1.1vượt đáy, văng xa dần
Bước vừa phải đi dần về đáy; bước quá lớn vượt đáy rồi văng xa dần.
Learning rate và chuẩn hóa31

Hỏi nhanh

Linear regression tối ưu MSE, loss qua các vòng là 15.9, 41.2, 260, 17 000, rồi NaN. Shape và công thức gradient đều đã kiểm. Ta nên thử gì trước?

Learning rate và chuẩn hóa32

Chuẩn hóa đặc trưng

zj=xj−μjσjz_j = \frac{x_j - \mu_j}{\sigma_j}
Dữ liệu gốc Đã chuẩn hóa
Số điều kiện 10510^5 1.11.1
Ngưỡng η\eta 1.4⋅10−41.4 \cdot 10^{-4} 0.950.95
Số vòng tới sát đáy ~180 000 28

μ,σ\mu, \sigma tính trên tập train, dùng lại cho test.

Learning rate và chuẩn hóa33

Sau chuẩn hóa: ba learning rate

Loss theo vòng lặp (thang log) với ba learning rate.010203040vòng lặp10⁻¹10⁰10¹η = 0.01 · quá chậmη = 0.1 · vừaη = 1 · nổ
Loss theo vòng lặp (thang log) với ba learning rate.
Learning rate và chuẩn hóa34

Thung lũng hẹp thành cái bát tròn

Chênh thang đo tạo thung lũng hẹp; chuẩn hóa đưa về gần tròn.chưa chuẩn hóazigzag trong thung lũng hẹpđã chuẩn hóađi gần thẳng về đáy
Chênh thang đo tạo thung lũng hẹp; chuẩn hóa đưa về gần tròn.
Learning rate và chuẩn hóa35

Cùng gradient descent, hai thang đo

Cùng gradient descent trên 200 căn hộ: dữ liệu gốc tiến nhanh vài vòng đầu rồi gần như đứng yên; dữ liệu đã chuẩn hóa về sát đường chéo sau khoảng 20 vòng.
Learning rate và chuẩn hóa36

Hỏi nhanh

Chuẩn hóa feature rồi học lại cho tới khi MSE chạm đáy. So với mô hình học trên dữ liệu gốc, cái gì thay đổi?

06

Thực hành và đọc kết quả

Thực hành và đọc kết quả38

Dùng scikit-learn

X_tr, X_te, y_tr, y_te = train_test_split(
    X, y, test_size=0.2, random_state=0)
model = LinearRegression().fit(X_tr, y_tr)
print(model.score(X_tr, y_tr),
      model.score(X_te, y_te))
Kết quả0.9604123189943734 0.9689505848749018

Hai số là R2R^2 train và test; hệ số trùng code tự viết.

Đọc hệ số cho đúng:

  • Hệ số phụ thuộc đơn vị; muốn so sánh thì chuẩn hóa trước.
  • Hệ số là mối liên hệ khi giữ các biến khác cố định, không phải nhân quả.
  • Luôn vẽ phần dư theo dự đoán.
Thực hành và đọc kết quả39

Đồ thị phần dư

Phần dư tốt rải đều quanh 0; uốn cong hay loe dần là có vấn đề.ổnuốn congloe dầnphần dư theo dự đoán
Phần dư tốt rải đều quanh 0; uốn cong hay loe dần là có vấn đề.
Thực hành và đọc kết quả40

Hỏi nhanh

Linear regression cho hệ số dương giữa số kem bán ra và số vụ đuối nước mỗi tuần. Chỉ từ kết quả này, ta kết luận được gì?

Thực hành và đọc kết quả41

Đoán độ phức tạp trước khi nộp

“Tuyến tính” là theo tham số; đặc trưng có thể là x2x^2, log⁡x\log x, x1x2x_1 x_2.

Nếu t≈Cnkt \approx C n^k thì

log⁡t=klog⁡n+log⁡C\log t = k \log n + \log C

Hồi quy trên trục log-log: hệ số góc ≈1.98\approx 1.98, gợi tăng gần bậc hai trong miền đo. Với n=2⋅105n = 2 \cdot 10^5: ngoại suy khoảng 38 giây; chưa là chứng minh Big-O.

Thực hành và đọc kết quả42

Độ dốc trên trục log-log

Trục log-log: độ dốc gần 2 nghĩa là thời gian tăng theo n².10⁻³10⁻²10⁻¹10⁰10¹10²10³10⁴10⁵ngiâygiới hạn 1 giâyn = 2·10⁵: ~38 giâyđộ dốc ≈ 1.98
Trục log-log: độ dốc gần 2 nghĩa là thời gian tăng theo n².
Thực hành và đọc kết quả43

Hỏi nhanh

Sau khi tạo thêm feature, mô hình nào không giải được bằng code linear regression của bài này?

Thực hành và đọc kết quả44

Khi đi thi

  • LinearRegression trước để có mốc.
  • Loss nổ: chuẩn hóa trước, chỉnh learning rate sau.
  • Tự viết gradient thì kiểm sai phân.
07

Luyện đề

Luyện đề46

Luyện đề 1

Với L(θ)=N−1∑n=0N−1(yn−θ⊤xn)2L(\theta) = N^{-1}\sum_{n=0}^{N-1}(y_n - \theta^\top x_n)^2, gradient theo θ\theta là gì?

Đề thiUSA-NA-AIO 2026 · Vòng 1 · Part 4.2

Luyện đề47

Luyện đề 2

Công thức nghiệm θ∗=(X~⊤X~)−1X~⊤y\boldsymbol\theta^\ast = (\tilde X^\top\tilde X)^{-1}\tilde X^\top\mathbf y dùng được khi nào?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 34

Luyện đề48

Luyện đề 3

Hệ phương trình chuẩn của một bộ dữ liệu có số điều kiện cỡ 101010^{10}. Vì sao điều này đáng lo khi giải bằng máy?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 35

Luyện đề49

Chốt ý

Linear regression cực tiểu MSE; nghiệm đóng là phép chiếu vuông góc.

Gradient descent cần η<2/λmax⁡\eta < 2/\lambda_{\max}; chuẩn hóa đặc trưng làm bài toán dễ hơn nhiều.

Luyện đề50

Sau giờ học

Làm 10 câu kiểm tra cuối bài trên trang bài học.

Chạy notebook: đổi learning rate, thử bỏ bước chuẩn hóa, xem kết quả đổi ra sao.