Chuyển tới nội dung chính

Bình phương tối thiểu

Kéo thảTính lại thậtNghiệm dạng đóng

Bình phương tối thiểu

Kéo hai tay cầm để chọn độ dốc và chặn, rồi so đường bạn kéo với nghiệm mà một công thức cho ra ngay.

Bài trước đã cho mô hình nghèo nhất có thể: nó chỉ xuất ra một hằng số, nên chọn mô hình là chọn một con số. Bài này thêm đúng một tham số nữa, và chuyện đổi hẳn. Mô hình giờ là một đường thẳng y = m*x + b, tức bạn phải chọn hai con số cùng lúc: độ dốc m và chặn b. Chúng dính vào nhau, hạ đầu này thì đầu kia nhổng lên, nên không thể mò từng cái một cách độc lập.

Điều đáng học không phải là "bình phương tối thiểu tìm được đường tốt". Điều đáng học là nó tìm được đường tốt bằng một công thức, chứ không bằng cách thử. Với hai tham số thì công thức đó vẫn viết ra được trên một dòng, và nó cho nghiệm chính xác: không phải nghiệm gần đúng sau nhiều vòng lặp, không có tham số học, không có điểm dừng.

Sim dưới đây có tám điểm cố định và một đường bạn kéo bằng hai tay cầm ở hai đầu. Kéo cho các ô vuông nhỏ lại, rồi bấm Khớp tốt nhất để engine đặt đường về đúng nghiệm công thức đóng và so với đường bạn vừa kéo.

Bình phương tối thiểu · kéo đường cho khít
n = 8m = 0.33b = 2.37MSE = 2.50R² = 0.29Σ phần dư = 8.60↓ còn giảm được
xy(x̄, ȳ) = (4.50, 4.91)

Ở trạng thái mở đầu, sim đang nói gì

Đường mở đầu được đặt lệch có chủ ý. Ô kết quả đọc n = 8, m = 0.33, b = 2.37, MSE = 2.50, R² = 0.29, Σ phần dư = 8.60, và huy hiệu ghi còn giảm được.

Con số 0.33 không phải số ngẫu nhiên: hai tay cầm đang ở 2.55.5, đặt tại x = 0.4x = 9.6, nên độ dốc đúng bằng 3 chia 9.2. Toàn bộ trạng thái nhìn thấy được chỉ do hai chiều cao đó quyết định, và đó chính là lý do sim cho kéo hai tay cầm thay vì cho hai thanh trượt riêng cho mb: bạn kéo một đầu thì cả hai tham số đổi cùng lúc, và cảm giác "hai tham số dính nhau" là cảm giác đúng.

Vòng tròn nét đứt giữa hình là điểm trung bình (x̄, ȳ) = (4.50, 4.91). Đường mở đầu đi dưới1.08 đơn vị. Bấm Khớp tốt nhất thì hai tay cầm nhảy về 1.629.01, ô kết quả thành m = 0.80, b = 1.30, MSE = 0.15, R² = 0.96, Σ phần dư = 0.00, huy hiệu đổi thành gần tối ưu, và đường xuyên đúng qua vòng tròn đó.

Khoảng cách giữa hai trạng thái là một con số: MSE mở đầu gấp 17.1 lần MSE tối ưu.

Hai tham số thay vì một, và vì sao chúng dính nhau

Thử ngay trên sim: nhấc cả hai tay cầm lên cùng một lượng. Ô m không nhích một chữ số nào, còn b chạy. Bây giờ nhấc một tay cầm thôi: cả m lẫn b đều đổi. Nói cách khác, cặp (yL, yR) và cặp (m, b) là cùng một thông tin viết trong hai hệ toạ độ, và phép đổi hệ đó là một phép biến đổi tuyến tính đảo được.

Vì có hai tham số nên "làm nhỏ tổng bình phương" không còn là một bài toán một chiều. Với hằng số thì hàm mất mát là một parabol trên đường thẳng số. Với đường thẳng thì nó là một mặt parabol trong mặt phẳng (m, b), và mặt đó không tròn: đo được ngay, từ nghiệm đẩy độ dốc lệch 0.01 thì tổng bình phương tăng 0.0204, còn đẩy chặn lệch 0.01 thì nó chỉ tăng 0.0008. Cùng một con số lệch, hai cái giá khác nhau 25.5 lần, và 25.5 đúng bằng Σx² chia n, tức 204 chia 8, vì lệch độ dốc bị nhân với x trước khi bình phương.

Cần một chú thích trung thực ở đây: mb không cùng đơn vị, nên phép so trên nói về giá của một đơn vị lệch, chứ không nói tham số nào quan trọng hơn. Điều nó nói được thì vẫn thực dụng: mắt ta chỉnh đường theo chiều dọc, mà chiều dọc là chiều rẻ.

Công thức đóng, và cách tự kiểm rằng nó là nghiệm chính xác

Với đường thẳng, nghiệm bình phương tối thiểu có công thức. Nó chỉ cần năm con số đọc từ dữ liệu trong một lượt quét: n, Σx, Σy, Σx², Σxy. Trên đám điểm của sim, năm con số đó là 8, 36, 39.3, 204, 210.6.

m = (n*Sxy - Sx*Sy) / (n*Sxx - Sx*Sx)
b = (Sy - m*Sx) / n

Thay số vào: tử số là 8*210.6 - 36*39.3, tức 1684.8 - 1414.8, tức đúng 270. Mẫu số là 8*204 - 36*36, tức 1632 - 1296, tức đúng 336. Vậy m = 270/336 = 0.8036, rồi b = 1.2964. Ô kết quả làm tròn hai chữ số nên nó in 0.801.30; con số 1.30 là bản làm tròn của 1.2964, không phải một giá trị khác.

Không có vòng lặp nào ở đây. Không có tốc độ học, không có số bước, không có tiêu chí dừng. Một lượt quét dữ liệu, vài phép nhân, xong.

Nhưng "công thức" tự nó không chứng minh gì. Cách tự kiểm nằm ngay trong tay bạn: thử lệch đi rồi xem tổng bình phương có tăng không. Bấm Khớp tốt nhất, rồi nhấc một tay cầm lên chút xíu. MSE tăng. Nhấc xuống. Cũng tăng. Cổng kiểm làm đúng việc đó một cách máy móc và chặt hơn:

  • hai mươi phép nhấc quanh nghiệm, năm cỡ bước từ 1e-4 tới 1, hai chiều, hai tham số: cả hai mươi đều làm tổng bình phương tăng thật
  • mức tăng khớp đúng công thức đại số: lệch độ dốc một lượng h thì tổng tăng nhân Σx², lệch chặn thì tăng nhân n
  • 7.008.002 đường thẳng trên hai lưới (dốc, chặn), một lưới thô rộng và một lưới mịn, và không một đường nào cho tổng bình phương nhỏ hơn nghiệm công thức

Lưới mịn được neo vào số chẵn 0.71.2 chứ không neo vào nghiệm, nên nó không chứa nghiệm: nếu neo vào nghiệm thì câu "lưới đồng ý với công thức" chỉ là nói lại chính nó. Điểm tốt nhất trên lưới mịn cách nghiệm chưa tới một phần mười nghìn về độ dốc, và nó vẫn thua.

Chính điểm đó còn cho thấy hai tham số dính vào nhau chứ không chỉ có hai độ cong khác nhau. Bước lưới mịn là 0.0001, nên nửa bước là 0.00005. Về độ dốc, điểm tốt nhất cách nghiệm 0.0000286, tức trong nửa bước. Về chặn, nó cách 0.000129, tức hơn nửa bước. Một mặt parabol có hai trục thẳng theo hai tham số thì không làm được vậy: đáy của nó phải nằm trong nửa bước ở cả hai chiều. Đáy ở đây là một lòng máng chéo, nên đi đúng độ dốc không có nghĩa là đi đúng chặn.

Một chi tiết trung thực về giới hạn của phép đo. Nếu lệch độ dốc chỉ 1e-9 thì mức tăng lý thuyết là 2.04e-16, nhỏ hơn một ulp của tổng bình phương, và cổng đo ra hiệu âm -4.44e-16. Không phải công thức sai: phép trừ hai tổng gần bằng nhau đã hết chữ số có nghĩa. Nên bước thử nhỏ nhất mà cổng dùng là 1e-4, và câu đúng ở bước 1e-9 là "không quan sát được", chứ không phải "bằng 0".

Đường khớp luôn đi qua điểm trung bình

Đây là bất biến đẹp nhất của bài, và nó đọc thẳng ra từ công thức thứ hai: b = ȳ - m*x̄. Chuyển vế thì thành m*x̄ + b = ȳ, tức đường khớp tại cho đúng ȳ. Trên sim, (x̄, ȳ) = (4.50, 4.91), chính xác hơn là 4.54.9125, và sau khi bấm Khớp tốt nhất thì đường xuyên qua vòng tròn nét đứt.

Cổng kiểm khẳng định điều đó trên 145 tập dữ liệu: đám điểm của bài, mười sáu biến thể dời từng điểm một, và một trăm hai mươi tám tập sinh bằng một bộ sinh số tiền định viết trong chính cổng. Trên cả 145 tập, khe lệch giữa m*x̄ + bȳ đều dưới 1e-9, tức chỉ còn là rác của dấu phẩy động.

Chiều còn lại mới cho bất biến này giá trị. Nếu mọi đường đều đi qua điểm trung bình thì câu trên rỗng. Cổng quét cả 10201 đường mà hai tay cầm có thể tạo ra trên lưới bước 0.1, và không một đường nào trong số đó đi qua (x̄, ȳ). Đường mở đầu chẳng hạn, nó đi dưới điểm đó 1.08 đơn vị. Nên "đi qua điểm trung bình" là đặc điểm của nghiệm, không phải đặc điểm của đường thẳng.

Và chú ý một chuyện dễ đọc lẫn: (4.50, 4.91) không phải một điểm dữ liệu. Đường khớp không đi qua một điểm nào của đám mây, nó đi qua trọng tâm của đám mây.

Tổng phần dư bằng 0, và điều đó không đúng với một đường bất kỳ

Phần dư là khoảng cách dọc có dấu từ điểm tới đường. Ở nghiệm, tổng có dấu của tất cả phần dư bằng 0: phần thò lên và phần thụt xuống cân nhau tuyệt đối. Ô kết quả in Σ phần dư = 0.00 sau khi bấm Khớp tốt nhất.

Cẩn thận với chữ "bằng 0" ở đây, vì đó là một tổng dấu phẩy động. Cổng không khẳng định nó đúng bằng 0. Nó khẳng định giá trị tuyệt đối dưới 1e-13in ra số đo được, cỡ 3.55e-15. Thậm chí cổng khẳng định thêm rằng con số đó khác 0, vì nếu ghim === 0 thì ta đang ghim vào sự may mắn của một cỗ máy cụ thể. Có một hệ quả hiển thị đi kèm: tuỳ dữ liệu, tổng đó có thể là một số âm cực nhỏ, và toFixed(2) của một số âm cực nhỏ là -0.00. Hàm hiển thị của engine phải chặn đúng chỗ đó, và cổng kiểm chặn ấy.

Chiều còn lại, lần nữa, đo trên 10201 đường của lưới: không một đường nào có trị tuyệt đối của tổng phần dư nhỏ hơn 1e-9, và cái tệ nhất lệch tới 40.7. Đường mở đầu lệch 8.60.

Thật ra hai mục vừa rồi là cùng một phương trình. Tổng phần dư là Σ(y - m*x - b), và nó bằng n nhân (ȳ - m*x̄ - b). Một cái bằng 0 thì cái kia cũng bằng 0. Cổng đối chiếu hai điều kiện đó trên cả 10201 đường và chúng đồng ý ở từng đường một.

Còn một phương trình nữa cùng họ mà sim không in ra: tổng của phần dư nhân x cũng bằng 0 ở nghiệm. Hai phương trình, hai tham số, một nghiệm duy nhất. Đó là toàn bộ nội dung của chữ "dạng đóng".

đo phần biến động giải thích được

MSE cho một con số tuyệt đối, và tuyệt đối thì khó đọc: MSE = 0.15 là tốt hay tệ phụ thuộc đơn vị của y. sinh ra để trả lời câu đó bằng một tỉ lệ.

Mẫu số của tỉ lệ là SStot, tổng bình phương độ lệch của y quanh trung bình của chính nó, trên dữ liệu này là 28.29. Con số đó chính là tổng bình phương của đường nằm ngang tốt nhất, tức của mô hình một hằng số ở bài trước. Nó là cái mốc mà một đường thẳng phải vượt.

R² = 1 - SSres / SStot

Ở nghiệm, SSres1.1682SStot28.29, nên R² = 0.9587, in ra là 0.96. Đọc thành lời: đường thẳng giải thích được 95.87% biến động của y, và 4.13% còn lại là phần nó không với tới. Hai phần đó cộng lại đúng 100%, vì đó là định nghĩa.

Có một đường thứ hai tới cùng con số, và nó không nhắc gì tới đường thẳng nào cả: hệ số tương quan Pearson của xy. Trên dữ liệu này r = 0.9791, và bằng 0.9587, khớp với tới mức chỉ còn rác dấu phẩy động. Cổng đo khe lệch đó trên toàn bộ họ 145 tập dữ liệu.

Nhưng đẳng thức đó chỉ đúng ở nghiệm. Đây là chỗ dễ nói quá nhất trong cả bài. Ở trạng thái mở đầu, 1 - SSres/SStot cho 0.29 trong khi vẫn là 0.9587: lệch 0.6656. Lý do đơn giản, r không hề biết bạn đang vẽ đường nào, nó chỉ đọc dữ liệu. Nên câu đúng là " của đường khớp bằng bình phương hệ số tương quan", không phải " bằng ".

có thể âm. Nó âm ngay khi đường bạn vẽ còn tệ hơn đường nằm ngang tại ȳ. Quét 10201 đường của lưới thì hơn một nửa cho âm, cái tệ nhất là -7.32, và ra ngoài khung vẽ thì còn tệ hơn nữa vì SSres không có trần. Nên đừng đọc như "phần trăm" trong mọi trường hợp; chỉ đọc như vậy khi nó nằm giữa 01.

Một tính chất tiện đi kèm: nhân mọi y với một hằng số t thì độ dốc và chặn nhân đúng t, còn không đổi. Cổng quét mười hai giá trị của t, trong đó năm giá trị âm, và ở cả mười một giá trị khác 0 thì giữ nguyên. Dời y thêm một hằng số thì chặn dời theo, độ dốc và đứng yên. Nghĩa là không phụ thuộc đơn vị đo, và đó là lý do người ta báo chứ không báo SSres.

Giá trị t = 0 là ngoại lệ, và nó đáng nói thẳng ra. Lúc đó mọi y thành 0, độ dốc và chặn vẫn nhân đúng t nên cả hai bằng 0, nhưng SStot cũng bằng 0 thành 0/0. Engine trả về "không xác định" thay vì trả về 1, và ô kết quả in một dấu gạch. Đây là quy ước: một mô hình khớp hoàn hảo trên dữ liệu không có biến động nào thì không giải thích được phần nào của một tổng bằng 0. Cùng chuyện đó xảy ra với đúng một điểm dữ liệu.

Huy hiệu "gần tối ưu" là một ngưỡng, không phải một sự thật

Huy hiệu bật xanh khi MSE của đường bạn kéo không vượt MSE tối ưu quá 3%. Con số 3 là một lựa chọn của người viết sim, không phải một mốc toán học.

Ngưỡng đó có một hệ quả cần biết. Mốc cắt trên dữ liệu này là 0.1504, còn MSE tối ưu là 0.1460, và cả hai đều in ra 0.15. Nghĩa là bạn không thể suy ra huy hiệu từ con số đang hiện: hai chữ số thập phân không đủ mịn để phân biệt. Đó chính là lý do sim cần một huy hiệu có chữ chứ không chỉ một mảng màu.

Đo cho cụ thể: từ nghiệm, nhấc tay cầm phải lên 0.1 thì MSE thành 1.0178 lần tối ưu, huy hiệu vẫn xanh. Nhấc 0.2 thì thành 1.0714 lần, huy hiệu tắt. Và trên 10201 đường của lưới, chỉ 6 đường được gắn nhãn, tức 0.059%. Đích rất hẹp, nên huy hiệu xanh là một tín hiệu thật.

Khi mọi điểm cùng một x thì không có đường nào khớp được

Mẫu số n*Σx² - (Σx)² bằng nhân phương sai của x. Nó bằng 0 đúng khi x không biến thiên, tức khi mọi điểm nằm trên một đường dọc. Lúc đó công thức chia cho 0, và đó không phải lỗi cài đặt mà là dữ liệu đang không xác định được độ dốc.

Đám điểm của sim không rơi vào cảnh đó, nhưng engine vẫn phải quyết định làm gì, nên đây là chỗ nói rõ quy ước. Lấy ba điểm cùng ở x = 3 với y1, 4, 7: cả tử số và mẫu số đều bằng đúng 0. Engine trả về đường nằm ngang tại ȳ = 4. Tổng bình phương của nó là 18, và SStot cũng là 18, nên bằng đúng 0: đường không giải thích được gì. Hệ số tương quan là không xác định, ô kết quả in dấu gạch.

Vì sao "nằm ngang" là quy ước chứ không phải câu trả lời? Vì trên dữ liệu đó, nghiêng đường bao nhiêu cũng không đổi một phần dư nào, miễn nó vẫn đi qua (3, 4). Cổng đo đúng điều này: độ dốc 0, độ dốc 5 và độ dốc -100 đều cho tổng bình phương 18. Có vô số đường tốt bằng nhau, engine chọn một, và bài phải nói ra là nó chọn.

Ranh giới của quy ước cũng là một quy ước. Engine coi mẫu số là 0 khi giá trị tuyệt đối của nó nhỏ hơn 1e-9. Cổng khẳng định hai bên của đúng cái mốc đó: khi mẫu số bằng chính xác 1e-9 thì engine vẫn dùng công thức và cho độ dốc 94868, một đường dựng gần như thẳng đứng; hạ mẫu số đi một ulp thì nó chuyển sang đường nằm ngang. Một ulp của mẫu số làm độ dốc nhảy chín mươi nghìn đơn vị. Ngưỡng nào cũng có một cạnh sắc như vậy, và biết nó ở đâu tốt hơn là tin rằng nó không tồn tại.

cao không có nghĩa là nhân quả, và cũng không có nghĩa là đúng dạng

R² = 0.96 nói đúng một điều: trên tám điểm này, một đường thẳng hút được 95.87% biến động của y. Nó không nói x gây ra y, và có một lý do máy móc: đổi vai hai trục thì hệ số tương quan giữ nguyên tới từng bit, nên cũng vậy. Cổng đo cả hai chiều và được đúng 0.9791 cả hai lần. Trong khi đó độ dốc khớp thì đổi hẳn, tức tính đối xứng của r là một tính chất thật chứ không phải chuyện hiển nhiên. Một con số không phân biệt được x với y thì không thể nói cái nào gây ra cái nào; chiều nhân quả là thứ người đọc mang vào.

Và một đường khớp tốt vẫn có thể sai dạng. Bình phương tối thiểu tìm đường thẳng tốt nhất, nó không hề kiểm giả thiết rằng quan hệ là đường thẳng. Có một ví dụ đo được và tính ra số chẵn: lấy y = x² với x chạy từ 1 tới 8. Đường khớp là m = 9, b = -15, và bằng 0.9529, in ra 0.95, trông rất đàng hoàng. Nhưng tám phần dư của nó là 7, 1, -3, -5, -5, -3, 1, 7, tức dấu xếp thành ++----++: một chữ U không thể rõ hơn. Cả hai bất biến của nghiệm vẫn đúng ở đó, tổng phần dư bằng đúng 0 và đường vẫn đi qua điểm trung bình, nên hai bất biến đó không bảo vệ bạn khỏi việc chọn sai dạng.

Cách nhìn ra chuyện đó không phải nhìn mà là nhìn phần dư: bật Ô vuông phần dư và xem các ô có rải đều hai bên đường hay có xếp thành một hình. Tổng phần dư bằng 0 chỉ bảo đảm chúng cân nhau, nó không bảo đảm chúng vô hình dạng.

Cuối cùng, sim này chỉ có một biến đầu vào và tám điểm cố định. Nó không có tập kiểm tra, không có vòng huấn luyện, và không nói gì về việc thêm biến hay chống quá khớp. Mọi con số trong bài đều là số trên đúng tám điểm này.

Điều rút ra

Khớp một đường thẳng là chọn hai tham số dính nhau, và bình phương tối thiểu cho nghiệm bằng một công thức đóng đọc từ năm con số: ở đây tử số là 270, mẫu số là 336, nên m = 0.8036b = 1.2964. Đó là nghiệm chính xác chứ không phải kết quả mò, và tự kiểm được: lệch độ dốc 0.01 thì tổng bình phương tăng đúng 0.0204, và không một đường nào trong 7.008.002 đường quét thử làm nó nhỏ hơn. Nghiệm mang hai dấu hiệu mà đường bất kỳ không có: nó đi qua điểm trung bình (4.50, 4.91), và tổng phần dư bằng 0; quét 10201 đường mà hai tay cầm chạm tới thì không đường nào có một trong hai. biến MSE thành tỉ lệ, ở nghiệm là 0.9587, đúng bằng bình phương hệ số tương quan 0.9791, nhưng chỉ ở nghiệm: ở trạng thái mở đầu hai con số lệch 0.6656. có thể âm, xuống tới -7.32 trên lưới, và cao vẫn không nói gì về nhân quả hay về việc đường thẳng có phải dạng đúng.

Câu hỏi tự kiểm0/3 đúngchưa trả lời
  1. 1Bấm Khớp tốt nhất rồi nhấc một tay cầm lệch đi. Điều gì chứng minh công thức đóng cho nghiệm chính xác chứ không phải một xấp xỉ tốt?
  2. 2Đường khớp luôn đi qua điểm trung bình (4.50, 4.91) và tổng phần dư của nó bằng 0. Hai điều đó liên quan với nhau thế nào?
  3. 3Ở trạng thái mở đầu, ô kết quả đọc R² = 0.29 trong khi hệ số tương quan của dữ liệu là 0.9791, tức bình phương của nó là 0.9587. Đọc thế nào cho đúng?