2017-01-18 26 views
6

Tôi không hiểu curve_fit không thể ước tính hiệp phương sai của thông số, do đó nâng cao số OptimizeWarning bên dưới. Các MCVE sau đây giải thích vấn đề của tôi:Tại sao `curve_fit` không thể ước tính hiệp phương sai của tham số nếu thông số khớp chính xác?

MCVE đoạn python

from scipy.optimize import curve_fit 
func = lambda x, a: a * x 
popt, pcov = curve_fit(f = func, xdata = [1], ydata = [1]) 
print(popt, pcov) 

Output

\python-3.4.4\lib\site-packages\scipy\optimize\minpack.py:715: 
OptimizeWarning: Covariance of the parameters could not be estimated 
category=OptimizeWarning) 

[ 1.] [[ inf]] 

Đối a = 1 chức năng phù hợp với xdataydata chính xác. Tại sao không phải là lỗi/phương sai 0 hoặc gần với 0, nhưng thay vào đó, inf?

Có trích dẫn này từ curve_fit SciPy Reference Guide:

Nếu ma trận Jacobian tại các giải pháp không có một cấp bậc đầy đủ, sau đó phương pháp 'lm' trả về một ma trận đầy np.inf, mặt khác các phương thức 'trf' và 'dogbox' bằng tay sử dụng hàm pseudoinverse của Moore-Penrose để tính toán ma trận hiệp phương sai.

Vì vậy, vấn đề cơ bản là gì? Tại sao ma trận Jacobian tại giải pháp không có thứ hạng đầy đủ?

Trả lời

6

Công thức tính hiệp phương sai của các tham số (Wikipedia) có số bậc tự do trong mẫu số. Mức độ tự do được tính như (số điểm dữ liệu) - (số tham số), là 1 - 1 = 0 trong ví dụ của bạn. Và this là nơi SciPy kiểm tra số bậc tự do trước khi chia cho nó.

Với xdata = [1, 2], ydata = [1, 2] bạn sẽ không có hiệp phương sai (lưu ý rằng mô hình vẫn khớp chính xác: khớp chính xác không phải là vấn đề).

Đây là loại vấn đề giống như phương sai mẫu không xác định nếu cỡ mẫu N là 1 (công thức cho phương sai mẫu có (N-1) trong mẫu số). Nếu chúng tôi chỉ lấy kích thước = 1 mẫu trong tổng dân số, chúng tôi không ước tính phương sai bằng 0, chúng tôi không biết gì về phương sai.

Các vấn đề liên quan