Tại sao không sử dụng các phương trình bình thường của người Viking để tìm các hệ số bình phương nhỏ nhất đơn giản?


17

Tôi thấy danh sách này ở đây và không thể tin rằng có rất nhiều cách để giải các hình vuông nhỏ nhất. "Phương trình bình thường" trên Wikipedia dường như là một cách khá đơn giản:

α^=y¯-β^x¯,β^= =ΣTôi= =1n(xTôi-x¯)(yTôi-y¯)ΣTôi= =1n(xTôi-x¯)2

Vậy tại sao không sử dụng chúng? Tôi giả định rằng phải có một vấn đề tính toán hoặc chính xác được đưa ra trong liên kết đầu tiên ở trên Mark L. Stone đề cập rằng SVD hoặc QR là các phương pháp phổ biến trong phần mềm thống kê và phương trình bình thường là "TERRIBLE từ độ tin cậy và quan điểm chính xác về số". Tuy nhiên , trong đoạn mã sau, các phương trình bình thường đang cho tôi độ chính xác tới ~ 12 chữ số thập phân khi so sánh với ba hàm python phổ biến: numpy's polyfit ; nữ tu sĩ của scipy ; và scikit-học của hồi quy tuyến tính .

Điều thú vị hơn là phương pháp phương trình bình thường là nhanh nhất khi n = 100000000. Thời gian tính toán đối với tôi là: 2,5 giây cho linregress; 12,9 giây cho polyfit; 4.2s cho linearRegression; và 1,8s cho phương trình bình thường.

Mã số:

import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import linregress
import timeit

b0 = 0
b1 = 1
n = 100000000
x = np.linspace(-5, 5, n)
np.random.seed(42)
e = np.random.randn(n)
y = b0 + b1*x + e

# scipy                                                                                                                                     
start = timeit.default_timer()
print(str.format('{0:.30f}', linregress(x, y)[0]))
stop = timeit.default_timer()
print(stop - start)

# numpy                                                                                                                                      
start = timeit.default_timer()
print(str.format('{0:.30f}', np.polyfit(x, y, 1)[0]))
stop = timeit.default_timer()
print(stop - start)

# sklearn                                                                                                                                    
clf = LinearRegression()
start = timeit.default_timer()
clf.fit(x.reshape(-1, 1), y.reshape(-1, 1))
stop = timeit.default_timer()
print(str.format('{0:.30f}', clf.coef_[0, 0]))
print(stop - start)

# normal equation                                                                                                                            
start = timeit.default_timer()
slope = np.sum((x-x.mean())*(y-y.mean()))/np.sum((x-x.mean())**2)
stop = timeit.default_timer()
print(str.format('{0:.30f}', slope))
print(stop - start) 

Các câu trả lời khá phóng đại. Sẽ không quá kinh khủng nếu bạn chỉ cần tránh tính toán ngược lại một cách rõ ràng.
đọc toán

3
Một vài lưu ý về tốc độ: bạn chỉ nhìn vào một hiệp phương sai duy nhất, do đó chi phí đảo ngược ma trận về cơ bản là 0. Nếu bạn nhìn vào vài nghìn đồng biến, điều đó sẽ thay đổi. Thứ hai, bởi vì bạn chỉ có một hiệp phương sai duy nhất, việc trộn dữ liệu là thứ thực sự chiếm rất nhiều thời gian của bạn trong các đối thủ cạnh tranh được đóng gói (nhưng điều này chỉ nên mở rộng tuyến tính, nên không phải là vấn đề lớn). Giải pháp phương trình bình thường không thực hiện việc trộn dữ liệu, vì vậy nó nhanh hơn, nhưng không có chuông và còi kèm theo kết quả của nó.
Vách đá AB

Câu trả lời:


22

Đối với bài toán , hình thành các phương trình Bình phương bình phương số điều kiện của bằng cách tạo . Nói một cách là số chữ số bạn mất trong tính toán nếu mọi thứ được thực hiện tốt. Và điều này thực sự không liên quan gì đến việc hình thành nghịch đảo của . Cho dù được giải quyết như thế nào , bạn đã mất các . Tức là, hình thành các phương trình Bình thường đã nhân đôi số chữ số chính xác bị mất, ngay lập tức.MộtxbMộtMộtTMộttôiog10(cond)MộtTMộtMộtTMộtx= =MộtTbtôiog10(cond(MộtTMột))= =2*tôiog10(cond(Một))

Nếu số điều kiện nhỏ (một là tốt nhất có thể), thì điều đó không thành vấn đề. Nếu số điều kiện = và bạn sử dụng phương pháp ổn định như QR hoặc SVD, bạn có thể có độ chính xác khoảng 8 chữ số. Nếu bạn hình thành các phương trình Bình thường, bạn đã bình phương số điều kiện thành và về cơ bản bạn không có độ chính xác trong câu trả lời của mình.10số 81016

Đôi khi bạn tránh xa các phương trình Bình thường, và đôi khi bạn không.


2
Một cách đơn giản hơn để xem nó (nếu bạn không biết / quan tâm đến các số điều kiện) là bạn (về cơ bản) nhân một thứ gì đó ("bình phương" nó), có nghĩa là bạn có thể mong đợi sẽ mất khoảng một nửa số bit của mình độ chính xác. (Điều này sẽ rõ ràng hơn nếu A là một vô hướng, và thật dễ dàng để thấy rằng việc tạo ra một ma trận không thực sự thay đổi vấn đề tiềm ẩn.)
Mehrdad

Bên cạnh sự khác biệt về độ chính xác, còn có sự khác biệt lớn về tốc độ giữa QR và phương trình bình thường? bởi vì trong trường hợp sau, bạn có thể giải (X'X) -1 * X'Y, chậm vì nghịch đảo? Tôi hỏi bởi vì tôi không chắc chắn cách thức hoạt động của QR, vì vậy có thể có một cái gì đó ở đó cũng chậm như đảo ngược một ma trận. Hay là điểm duy nhất xem xét sự mất chính xác?
Simon

4
MộtTMộtMộtTb

8

Nếu bạn chỉ phải giải quyết vấn đề một biến này, thì hãy tiếp tục và sử dụng công thức. Không có gì sai với điều đó cả. Tôi có thể thấy bạn viết một vài dòng mã trong ASM cho một thiết bị nhúng chẳng hạn. Trong thực tế, tôi đã sử dụng loại giải pháp này trong một số tình huống. Tất nhiên, bạn không cần phải kéo các thư viện thống kê lớn để giải quyết vấn đề nhỏ này.

Sự không ổn định về số lượng và hiệu suất là vấn đề của các vấn đề lớn hơn và thiết lập chung. Nếu bạn giải quyết các bình phương tối thiểu đa biến, v.v ... Đối với một vấn đề chung, bạn sẽ không sử dụng điều này, tất nhiên.


0

Không có gói thống kê hiện đại nào giải quyết được hồi quy tuyến tính với các phương trình bình thường. Các phương trình bình thường chỉ tồn tại trong các sách thống kê.

Các phương trình bình thường không nên được sử dụng khi tính toán nghịch đảo của ma trận là rất có vấn đề.

Tại sao sử dụng giảm dần độ dốc cho hồi quy tuyến tính, khi có sẵn một giải pháp toán học dạng đóng?

... Mặc dù phương trình bình thường trực tiếp có sẵn. Lưu ý rằng trong phương trình bình thường, người ta phải đảo ngược một ma trận. Bây giờ đảo ngược một ma trận tốn O (N3) cho tính toán trong đó N là số lượng hàng trong ma trận X tức là các quan sát. Hơn nữa, nếu X bị điều hòa thì nó sẽ tạo ra các lỗi tính toán trong ước tính ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.