Hồi quy tuyến tính
Mục tiêu
Phần tiêu đề “Mục tiêu”Sau bài này, bạn sẽ:
- Hiểu hồi quy tuyến tính (linear regression) dự đoán thế nào, và vì sao đường tốt nhất là đường có sai số bình phương trung bình (mean squared error, MSE) nhỏ nhất.
- Tự dẫn được công thức của và khi có một đặc trưng (feature), và đọc được phương trình chuẩn (normal equation) .
- Cài đặt bằng NumPy và scikit-learn, và giải thích được ý nghĩa của , .
- Nhận ra các giới hạn chính, như điểm ngoại lai (outlier), ngoại suy (extrapolation), và lúc phương trình chuẩn có vô số nghiệm.
Cần biết trước
Phần tiêu đề “Cần biết trước”- Tổng quan về Học máy, thuộc phần Học máy (Đã học)
- Đại số tuyến tính, thuộc phần Toán cho AI (Đã học)
- Giải tích, thuộc phần Toán cho AI (Đã học)
Trực giác
Phần tiêu đề “Trực giác”Bạn đang tìm thuê căn hộ. Bạn hỏi giá 10 căn quanh khu mình muốn ở và ghi lại thành bảng dưới đây. Cả bài sẽ dùng bảng này.
| Diện tích (m²) | Giá thuê (triệu đồng/tháng) |
|---|---|
| 25 | 6.7 |
| 30 | 6.5 |
| 36 | 8.8 |
| 42 | 8.8 |
| 48 | 9.4 |
| 55 | 12.2 |
| 60 | 12.0 |
| 68 | 14.1 |
| 75 | 13.9 |
| 85 | 16.8 |
Rồi một người quen báo có căn 65 m² sắp trống. Giá bao nhiêu thì hợp lý?
Nhìn bảng, bạn thấy ngay căn càng rộng thì càng đắt. Nhưng không đều: căn 30 m² lại rẻ hơn căn 25 m², căn 75 m² rẻ hơn căn 68 m². Giá còn phụ thuộc vị trí, tầng, nội thất, những thứ bảng không ghi. Vì vậy không đường thẳng nào đi qua đủ 10 điểm.
Điều bạn làm được là tìm một đường đi gần các điểm nhất, rồi dùng nó để đoán giá căn 65 m². Đó là toàn bộ ý tưởng của hồi quy tuyến tính.
Thử kẻ vài đường
Phần tiêu đề “Thử kẻ vài đường”Hãy thử hai cách đoán đơn giản:
- Đường A: bỏ qua diện tích, căn nào cũng đoán bằng giá trung bình của bảng, 10.92 triệu. Đây là một đường nằm ngang.
- Đường B: “mỗi m² 200 nghìn đồng”. Căn 25 m² đoán 5.0 triệu, căn 85 m² đoán 17.0 triệu.
Với mỗi căn, lấy giá thật trừ giá mà đường đoán. Hiệu này gọi là phần dư (residual).
Với đường B, căn 25 m² có phần dư 6.7 − 5.0 = 1.7: điểm nằm trên đường. Căn 75 m² có phần dư 13.9 − 15.0 = −1.1: điểm nằm dưới đường. Trên đồ thị, phần dư là đoạn thẳng đứng nối điểm dữ liệu với đường. Muốn so hai đường, bạn cần một con số gom phần dư của cả 10 căn lại.
Vì sao bình phương phần dư
Phần tiêu đề “Vì sao bình phương phần dư”Cách nghĩ đầu tiên là cộng các phần dư lại. Nhưng tổng phần dư của đường A đúng bằng 0, vì phần dư dương và âm quanh giá trung bình bù trừ nhau vừa khít. Vậy mà đường A rất tệ: nó đoán căn 25 m² và căn 85 m² cùng một giá.
Cách sửa là bình phương từng phần dư, rồi lấy trung bình. Con số này chính là sai số bình phương trung bình, viết tắt MSE. Có ba lý do để chọn bình phương:
- Không triệt tiêu. Bình phương luôn không âm, nên sai về phía nào cũng bị tính.
- Phạt nặng sai số lớn. Lệch 1 triệu tính 1 điểm, lệch 2 triệu tính 4 điểm. Nên hai căn cùng lệch 1 triệu (2 điểm) tốt hơn một căn đúng hẳn và một căn lệch 2 triệu (4 điểm). Mặt trái: một điểm nằm rất xa sẽ kéo cả đường về phía nó, như bạn sẽ thấy ở ô code thứ ba.
- Lấy đạo hàm được. Hàm bình phương trơn, còn hàm trị tuyệt đối có góc nhọn tại 0, ở đó không có đạo hàm. Nhờ đạo hàm, bạn tìm được đường tốt nhất bằng đại số thay vì thử mò.
MSE của các đường, tính bằng Python trên bảng trên:
| Đường | MSE |
|---|---|
| A: nằm ngang ở giá trung bình 10.92 | 10.50 |
| B: mỗi m² 200 nghìn đồng | 0.88 |
| Đường tốt nhất, sẽ tìm ở phần sau | 0.36 |
Đường B tốt hơn đường A rất nhiều, nhưng vẫn có đường tốt hơn nữa. Bài toán giờ đã rõ: trong mọi đường thẳng, tìm đường có MSE nhỏ nhất.
Lý thuyết
Phần tiêu đề “Lý thuyết”Phát biểu bài toán
Phần tiêu đề “Phát biểu bài toán”Bảng có mẫu (sample), mỗi mẫu là một căn hộ, nên . Mẫu thứ gồm đặc trưng là diện tích, và nhãn (label) là giá thuê thật. Chỉ số viết ở trên nghĩa là “căn thứ ”, không phải số mũ.
Mô hình đoán giá bằng một đường thẳng:
- (đọc là “y mũ”) là giá dự đoán, để phân biệt với giá thật .
- là trọng số (weight). Khi chỉ có một đặc trưng, chính là độ dốc (slope) của đường: diện tích tăng 1 m² thì giá dự đoán tăng triệu.
- là hệ số tự do (bias, còn gọi là intercept), chỗ đường thẳng cắt trục tung.
Phần lớn bài dùng một đặc trưng cho dễ nhìn. Mục dạng ma trận sẽ mở rộng cho nhiều đặc trưng.
Hàm mất mát MSE
Phần tiêu đề “Hàm mất mát MSE”Với căn thứ , giá dự đoán là , và phần dư là
Hàm mất mát (loss function) là MSE, trung bình bình phương phần dư trên cả căn:
Vài điều cần để ý:
- chỉ là phần dư đổi dấu. Bình phương lên thì như nhau.
- Dữ liệu đã cố định, nên chỉ còn là hàm của hai tham số (parameter) và .
- Nhiều sách dùng để số 2 triệt tiêu khi lấy đạo hàm. Nhân với một hằng số dương không dời điểm thấp nhất, nên nghiệm không đổi. Bài này dùng cho khớp với MSE của scikit-learn.
Bài toán là tìm và làm nhỏ nhất. Lời giải gọi là nghiệm bình phương tối thiểu (least squares).
Lời giải khi có một đặc trưng
Phần tiêu đề “Lời giải khi có một đặc trưng”là tổng bình phương của các biểu thức bậc nhất theo và , nên đồ thị của nó theo là một cái bát ngửa lên. Chỗ duy nhất mặt bát nằm phẳng (mọi đạo hàm riêng bằng 0) là đáy bát, nên chỉ cần cho hai đạo hàm riêng bằng 0 rồi giải. Điều này cần các căn không cùng một diện tích (xem mục “Khi nào nghiệm không duy nhất”).
Gọi là diện tích trung bình và là giá trung bình.
Bước 1: đạo hàm riêng theo . Theo quy tắc hàm hợp (chain rule), đạo hàm của bằng nhân đạo hàm của . Ở đây có đạo hàm theo bằng 1. Vậy:
Cho đạo hàm này bằng 0 rồi chia hai vế cho 2. Tổng trong ngoặc tách thành . Chia cho , ba phần lần lượt thành , và :
Chuyển vế:
Đọc bằng lời: , tức đường tốt nhất luôn đi qua điểm trung bình (mean point) , và trung bình phần dư bằng 0. Đường A cũng đi qua điểm này (nên tổng phần dư bằng 0) mà vẫn tệ: điều kiện này cần nhưng chưa đủ, còn phải chọn đúng độ dốc.
Bước 2: đạo hàm riêng theo . Lần này có đạo hàm theo là :
Cho đạo hàm này bằng 0, rồi bỏ hệ số vì nó khác 0:
Bước 3: thay từ bước 1 vào. Gọi độ lệch (deviation) so với trung bình là và . Biểu thức trong ngoặc trở thành:
Dòng thứ ba gom riêng hai số hạng có và hai số hạng còn lại. Phương trình ở bước 2 thành:
Bước 4: đổi đứng trước ngoặc thành . Các độ lệch khỏi trung bình luôn có tổng bằng 0: , tương tự . Do đó:
Lấy phương trình ở bước 3 trừ đẳng thức này, mỗi trước ngoặc thành , tức :
Bước 5: rút . Phá ngoặc, phương trình tách thành hai tổng:
Chuyển tổng thứ hai sang vế phải, chia cho tổng thứ nhất, rồi viết lại theo , ban đầu:
Có rồi thì theo bước 1.
Đọc công thức. Căn có hai độ lệch cùng dấu (rộng hơn và đắt hơn trung bình, hoặc nhỏ hơn và rẻ hơn) góp vào tử số một số dương, trái dấu thì góp số âm. Khi các số dương lấn át số âm thì và đường dốc lên. Mẫu số đo các diện tích trải rộng tới đâu, và chỉ bằng 0 khi mọi căn cùng diện tích.
Áp vào bảng căn hộ. Ở đây , , tử số bằng 598.32 và mẫu số bằng 3530.4. Do đó:
Đường tốt nhất là , với MSE khoảng 0.3615. Mỗi m² thêm vào làm giá dự đoán tăng khoảng 0.17 triệu (170 nghìn đồng). Còn chỉ là chỗ đường cắt trục tung, không phải “giá thuê căn 0 m²”: dữ liệu không có căn nào nhỏ như vậy.
Dạng ma trận và phương trình chuẩn
Phần tiêu đề “Dạng ma trận và phương trình chuẩn”Với nhiều đặc trưng, ví dụ thêm số phòng ngủ, mỗi căn là một vectơ , mỗi có trọng số riêng, và dự đoán là tích vô hướng cộng :
Ký hiệu ma trận giúp viết gọn bài toán cho mọi . Xếp dữ liệu thành ma trận thiết kế (design matrix) : mỗi hàng là một căn, mỗi cột là một đặc trưng, thêm một cột toàn số 1 ở cuối. Giá thật xếp thành vectơ . Với bảng căn hộ:
Tham số gộp vào vectơ . Với đặc trưng, hàng của là ( là đặc trưng thứ của căn thứ ) và , nên có hàng và cột.
Vì sao cần cột số 1? Tích vô hướng của hàng với là : cột số 1 để được cộng vào mọi dự đoán. Vậy chứa cả giá dự đoán, và chứa các . Bình phương độ dài của một vectơ, , là tổng bình phương các phần tử, nên MSE viết gọn thành:
Cho mọi đạo hàm riêng của hàm này (theo và ) bằng 0, bạn được phương trình bậc nhất. Viết bằng ma trận, cả hệ chỉ còn một dòng, gọi là phương trình chuẩn:
Không cần đạo hàm ma trận để hiểu nó. Chuyển vế phải sang vế trái rồi đặt ra ngoài, phương trình thành . Hàng của vế trái là tích vô hướng giữa cột của và , tức . Nhân với , hàng chính là (quy tắc hàm hợp như bước 2), còn hàng cuối, ứng với cột số 1, là . Vậy phương trình chuẩn chỉ là các phương trình “đạo hàm bằng 0” xếp vào ma trận. Với bảng căn hộ, nó là hệ hai ẩn:
Ở vế trái, 30988, 524 và 10 lần lượt là , và , các phần tử của . Ở vế phải, 6320.4 là và 109.2 là , các phần tử của . Chia phương trình thứ hai cho 10 được , đúng là của bước 1.
Nếu khả nghịch (invertible), nghiệm viết được thành:
Đây là cách viết nghiệm, không phải cách nên tính. Trong code, hãy dùng np.linalg.solve(X.T @ X, X.T @ y), hoặc tốt hơn là np.linalg.lstsq(X, y), vì nó giải trực tiếp trên mà không lập (LinearRegression của scikit-learn cũng vậy): lập ma trận này sẽ bình phương số điều kiện (condition number), mức mà sai số tương đối ở đầu vào, kể cả sai số làm tròn, có thể bị phóng đại ở kết quả. Với bảng căn hộ, số điều kiện theo chuẩn 2 (2-norm, mặc định của np.linalg.cond) tăng từ khoảng 165 lên khoảng 165² ≈ 27 nghìn, nhưng tính bằng ma trận nghịch đảo (inverse), bằng solve hay bằng lstsq thì vẫn cùng kết quả tới khoảng 14 chữ số.
Khi nào nghiệm không duy nhất
Phần tiêu đề “Khi nào nghiệm không duy nhất”Phương trình chuẩn luôn có nghiệm. Nghiệm là duy nhất khi khả nghịch, tức là khi các cột của độc lập tuyến tính (linearly independent): không cột nào viết được thành tổng có hệ số của các cột khác. Ba trường hợp hay làm hỏng điều này:
- Mọi mẫu có cùng giá trị của một đặc trưng. Nếu căn nào cũng 40 m², cột diện tích bằng 40 lần cột số 1.
- Đặc trưng trùng lặp. Ví dụ có cả diện tích theo m² lẫn theo ft²: cột ft² bằng cột m² nhân khoảng 10.76. Các cột phụ thuộc tuyến tính như vậy, hoặc gần như vậy, gọi là cộng tuyến (collinearity).
- Ít mẫu hơn tham số, tức , ví dụ 5 căn hộ nhưng 8 đặc trưng.
Khi đó suy biến (singular), và có vô số cho cùng một dự đoán trên tập huấn luyện, với cùng MSE nhỏ nhất.
Với một đặc trưng, trường hợp đầu hiện rõ qua định thức (determinant). Dùng các phần tử của trong hệ ở trên:
Dòng thứ hai thay rồi đặt ra ngoài. Dòng thứ ba đúng vì khai triển được , tức , đúng bằng biểu thức trong ngoặc. Định thức bằng 0 đúng khi mọi bằng nhau, cũng là lúc mẫu số trong công thức của bằng 0. Hậu quả trong code và cách xử lý: xem hộp thứ ba ở mục Lỗi hay gặp.
Giới hạn
Phần tiêu đề “Giới hạn”Hồi quy tuyến tính đơn giản, nhanh, dễ giải thích, nhưng có bốn giới hạn:
- Chỉ tuyến tính theo các đặc trưng bạn đưa vào. Muốn bám đường cong thì thêm đặc trưng như (hộp đầu ở mục Lỗi hay gặp). Thêm bao nhiêu là vừa thì xem bài Overfitting và Underfitting.
- Nhạy với điểm ngoại lai. Một điểm lạ có thể kéo lệch cả đường (ô code thứ ba).
- Ngoại suy dễ sai. Dữ liệu chỉ có từ 25 đến 85 m² (hộp thứ hai ở mục Lỗi hay gặp).
- Tốn kém khi lớn. Lập cỡ tốn cỡ phép tính, giải hệ thêm cỡ . Bài Gradient Descent tìm đáy của cùng hàm bằng từng bước nhỏ.
Minh họa
Phần tiêu đề “Minh họa”Giờ bạn tự tìm đường tốt nhất bằng tay. Hình dưới là biểu đồ phân tán (scatter plot) của 10 căn hộ. Thanh trượt làm đường xoay, thanh trượt nâng hoặc hạ cả đường. Các đoạn thẳng đứng là phần dư, MSE cập nhật ngay khi bạn kéo. Dấu × là điểm trung bình . Hãy thử:
- Lúc đầu , : đường nằm ngang, gần như đường A, MSE 10.5020.
- Tăng một chút, rồi hạ cho đường đi lại qua dấu ×. MSE giảm. Lặp lại vài lần.
- Đừng tăng mãi. Ở , , đường vẫn đi sát dấu × nhưng quá dốc, MSE vọt lên 19.1240. Đi qua điểm trung bình là cần, nhưng chưa đủ.
- Khi MSE đủ nhỏ, hình hiện dòng “Rất gần đường tốt nhất”. Bấm Hiện đường tốt nhất để so với , MSE 0.3615. Thanh trượt đi theo bước 0.005 và 0.1, nên điểm gần nhất bạn chạm được là , , MSE 0.3617.
- Một căn hộ
- Điểm trung bình (52.4, 10.92)
- Phần dư: đoạn thẳng đứng từ một điểm tới đường của bạn
Mười điểm đi lên từ trái sang phải, từ căn 25 m² giá 6.7 triệu tới căn 85 m² giá 16.8 triệu. Căn rộng hơn thường đắt hơn, nhưng các điểm không nằm trên cùng một đường thẳng. Dấu hình chữ X đánh dấu điểm trung bình (52.4, 10.92). Đường tốt nhất luôn đi qua điểm này.
Ví dụ code
Phần tiêu đề “Ví dụ code”Ba ô code dưới đây làm lại các bước trên bằng Python. Ô nào cũng tự tạo bảng căn hộ, nên chạy ô nào trước cũng được. Ô thứ hai lần đầu chạy lâu hơn, vì trình duyệt phải tải thêm scikit-learn.
Ô đầu tiên lập ma trận thiết kế, giải phương trình chuẩn bằng np.linalg.solve, rồi tính MSE.
Phương trình chuẩn bằng NumPy
import numpy as np
# Bảng 10 căn hộ (dữ liệu minh họa, tự tạo cho bài học).# area: diện tích (m²), rent: giá thuê (triệu đồng/tháng).# dataset: apartmentsarea = np.array([25, 30, 36, 42, 48, 55, 60, 68, 75, 85])rent = np.array([6.7, 6.5, 8.8, 8.8, 9.4, 12.2, 12.0, 14.1, 13.9, 16.8])
# Ma trận thiết kế X: cột diện tích, thêm một cột toàn số 1 cho hệ số tự do b.m = len(area)X = np.column_stack([area, np.ones(m)])
# Phương trình chuẩn: (X^T X) theta = X^T y.# np.linalg.solve giải thẳng hệ phương trình, không tính ma trận nghịch đảo.theta = np.linalg.solve(X.T @ X, X.T @ rent)w, b = theta # thứ tự khớp với thứ tự cột của X
# MSE: trung bình bình phương phần dư.y_hat = X @ thetamse = np.mean((y_hat - rent) ** 2)
print(f"b = {b:.4f}")print(f"w = {w:.4f}")print(f"MSE = {mse:.4f}")Lần chạy đầu cần tải Python, khoảng 10 MB.
Kết quả là , và MSE , khớp với công thức một đặc trưng và với đường tốt nhất trong phần Minh họa.
Ô thứ hai dùng LinearRegression của scikit-learn, lớp giải đúng bài toán bình phương tối thiểu thông thường (ordinary least squares, OLS) ở trên. Ô này đối chiếu với công thức tay, dự đoán giá hai căn mới, rồi vẽ đường.
scikit-learn và dự đoán căn mới
import matplotlib.pyplot as pltimport numpy as npfrom sklearn.linear_model import LinearRegression
# Bảng 10 căn hộ (dữ liệu minh họa, tự tạo cho bài học).# area: diện tích (m²), rent: giá thuê (triệu đồng/tháng).# dataset: apartmentsarea = np.array([25, 30, 36, 42, 48, 55, 60, 68, 75, 85])rent = np.array([6.7, 6.5, 8.8, 8.8, 9.4, 12.2, 12.0, 14.1, 13.9, 16.8])
# scikit-learn nhận X dạng bảng: m hàng (mẫu), n cột (đặc trưng). Ở đây n = 1.X = area.reshape(-1, 1)model = LinearRegression().fit(X, rent) # tự thêm hệ số tự do bprint(f"sklearn: w = {model.coef_[0]:.4f}, b = {model.intercept_:.4f}")
# Đối chiếu với công thức một đặc trưng ở phần Lý thuyết.dx = area - area.mean()dy = rent - rent.mean()w = np.sum(dx * dy) / np.sum(dx**2)b = rent.mean() - w * area.mean()print(f"formula: w = {w:.4f}, b = {b:.4f}")
# Dự đoán hai căn mới: 65 m² (trong vùng dữ liệu) và 300 m² (xa ngoài vùng).new_area = np.array([[65], [300]])for a, p in zip(new_area[:, 0], model.predict(new_area)): print(f"{a} m² -> {p:.2f}")
# Vẽ dữ liệu và đường tốt nhất, chỉ trong vùng có dữ liệu.xs = np.array([[20], [90]])plt.scatter(area, rent, label="apartments")plt.plot(xs, model.predict(xs), color="C1", label="best line")plt.xlabel("Area (m²)")plt.ylabel("Rent (million VND/month)")plt.legend()plt.show()Lần chạy đầu cần tải Python, khoảng 10 MB.
Hai dòng đầu khớp nhau: scikit-learn và công thức tay cho cùng , . Hai điều cần nhớ khi dùng scikit-learn:
Xphải là bảng hai chiều, hàng và cột, kể cả khi chỉ có một đặc trưng. Đó là lý do córeshape(-1, 1).- Trọng số nằm trong
coef_, còn nằm trongintercept_. Bạn không cần tự thêm cột số 1.
Căn 65 m² được đoán 13.06 triệu đồng/tháng, nằm giữa giá căn 60 m² (12.0) và căn 68 m² (14.1). Nghe hợp lý. Căn 300 m² được đoán 52.88 triệu, một con số đáng ngờ (xem mục Lỗi hay gặp).
Ô thứ ba thử một điểm ngoại lai: một căn 110 m² bị gõ nhầm giá 19.0 thành 9.0. Ô này dùng np.linalg.lstsq để khớp đường trước và sau khi thêm điểm đó.
Một điểm ngoại lai
import matplotlib.pyplot as pltimport numpy as np
# Bảng 10 căn hộ (dữ liệu minh họa, tự tạo cho bài học).# area: diện tích (m²), rent: giá thuê (triệu đồng/tháng).# dataset: apartmentsarea = np.array([25, 30, 36, 42, 48, 55, 60, 68, 75, 85])rent = np.array([6.7, 6.5, 8.8, 8.8, 9.4, 12.2, 12.0, 14.1, 13.9, 16.8])
def fit(x, y): # np.linalg.lstsq giải bình phương tối thiểu thẳng trên X, không lập X^T X. X = np.column_stack([x, np.ones(len(x))]) w, b = np.linalg.lstsq(X, y)[0] return w, b
# Thêm căn 110 m², lớn hơn mọi căn khác, nhưng giá bị gõ nhầm 19.0 thành 9.0.area_out = np.append(area, 110)rent_out = np.append(rent, 9.0)
w1, b1 = fit(area, rent)w2, b2 = fit(area_out, rent_out)print(f"without outlier: w = {w1:.4f}, b = {b1:.2f}")print(f"with outlier: w = {w2:.4f}, b = {b2:.2f}")
# Vẽ hai đường để so sánh.xs = np.array([20, 115])plt.scatter(area, rent, label="apartments")plt.scatter([110], [9.0], color="C3", marker="x", s=80, label="outlier")plt.plot(xs, w1 * xs + b1, color="C1", label="without outlier")plt.plot(xs, w2 * xs + b2, color="C3", linestyle="--", label="with outlier")plt.xlabel("Area (m²)")plt.ylabel("Rent (million VND/month)")plt.legend()plt.show()Lần chạy đầu cần tải Python, khoảng 10 MB.
Chỉ thêm một điểm trong 11, độ dốc đã giảm hơn một nửa: từ 0.1695 xuống 0.0760 (từ khoảng 170 nghìn còn 76 nghìn đồng mỗi m²). Còn tăng từ 2.04 lên 6.36. Vì sao một điểm lại mạnh đến vậy?
- So với đường cũ, điểm mới lệch gần 12 triệu. Bình phương lên được hơn 130, trong khi tổng bình phương phần dư của cả 10 căn kia chỉ khoảng 3.6. Muốn MSE nhỏ, đường buộc phải nghiêng về phía điểm này.
- Điểm nằm ở mép phải, xa điểm trung bình theo chiều ngang, như người ngồi ở đầu bập bênh: càng xa trục, càng dễ làm tấm ván nghiêng. Điểm như vậy gọi là điểm đòn bẩy cao (high-leverage point).
Vì vậy, hãy vẽ dữ liệu ra xem và kiểm tra các điểm nằm xa đám đông trước khi khớp mô hình.
Lỗi hay gặp
Phần tiêu đề “Lỗi hay gặp”Kiểm tra nhanh
Phần tiêu đề “Kiểm tra nhanh”Tóm tắt và đọc thêm
Phần tiêu đề “Tóm tắt và đọc thêm”Ý chính:
- Hồi quy tuyến tính dự đoán và chọn tham số làm MSE nhỏ nhất. Bình phương để sai số không triệt tiêu, phạt nặng sai số lớn, và lấy đạo hàm được.
- Với một đặc trưng: , còn bằng tổng tích các độ lệch chia cho tổng bình phương độ lệch của . Đường tốt nhất đi qua điểm trung bình.
- Dạng tổng quát là phương trình chuẩn , với có thêm cột số 1. Nghiệm duy nhất khi các cột của độc lập tuyến tính. Trong code, dùng
lstsqhoặcLinearRegression, không tự tính nghịch đảo. - cho biết dự đoán đổi bao nhiêu khi tăng 1 đơn vị và các đặc trưng khác giữ nguyên. Cẩn thận với ngoại suy và điểm ngoại lai.
Đọc thêm:
- Vũ Hữu Tiệp (2016). Machine Learning cơ bản, Bài 3: Linear Regression. Tiếng Việt, có ví dụ NumPy và scikit-learn. Ký hiệu hơi khác: là số mẫu, cột số 1 đặt ở đầu.
- James, G., Witten, D., Hastie, T., Tibshirani, R. (2013). An Introduction to Statistical Learning (bản 1), chương 3: Linear Regression. Mục 3.1: lời giải một đặc trưng. Mục 3.3.3: điểm ngoại lai, điểm đòn bẩy cao, cộng tuyến.
- Ng, A. (2003). CS229 Lecture notes (PDF), Part I: Linear Regression (bản cũ, Stanford). Dẫn phương trình chuẩn bằng đạo hàm ma trận.
- Deisenroth, M. P., Faisal, A. A., Ong, C. S. (2020). Mathematics for Machine Learning, chương 9: Linear Regression. Mục 9.4 giải thích phương trình chuẩn bằng hình chiếu vuông góc (orthogonal projection).
- scikit-learn developers (2007–2026). scikit-learn 1.8 User Guide, mục 1.1.1 Ordinary Least Squares. Tài liệu chính thức của
LinearRegression.
Trình duyệt đang chặn lưu dữ liệu. Tiến độ sẽ mất khi bạn tải lại trang.
Nội dung theo giấy phép CC BY-NC-SA 4.0. Mã nguồn theo giấy phép MIT.Giới thiệu