Làm thế nào để tôi giải thích ma trận hiệp phương sai từ một đường cong phù hợp?


15

Tôi không quá giỏi về thống kê, vì vậy xin lỗi nếu đây là một câu hỏi đơn giản. Tôi lắp một đường cong để một số dữ liệu, và đôi khi dữ liệu của tôi phù hợp nhất một số mũ âm dưới hình thức , và đôi khi sự thích nghi là gần gũi hơn với một * e ( - b * x 2 ) + c . Tuy nhiên, đôi khi cả hai đều thất bại, và tôi muốn quay trở lại phù hợp tuyến tính. Câu hỏi của tôi là, làm thế nào tôi có thể xác định mô hình nào phù hợp với một dữ liệu cụ thể tốt nhất từ ​​ma trận hiệp phương sai kết quả được trả về từmột*e(-b*x)+cmột*e(-b*x2)+c scipy.optizes.curve_fit () ? Tôi tin rằng phương sai nằm trên một trong những đường chéo của ma trận này, nhưng tôi không chắc làm thế nào để giải thích điều đó.

CẬP NHẬT: Dựa trên một câu hỏi tương tự , tôi hy vọng rằng ma trận phương sai hiệp phương sai có thể cho tôi biết mô hình nào trong ba mô hình tôi đang cố gắng phù hợp nhất với dữ liệu (Tôi đang cố gắng khớp nhiều bộ dữ liệu với một trong ba mô hình này).

Các ma trận kết quả trông như thế này cho ví dụ đã cho:

pcov_lin 
[[  2.02186921e-05  -2.02186920e-04]
 [ -2.02186920e-04   2.76322124e-03]]
pcov_exp
[[  9.05390292e+00  -7.76201283e-02  -9.20475334e+00]
 [ -7.76201283e-02   6.69727245e-04   7.90218415e-02]
 [ -9.20475334e+00   7.90218415e-02   9.36160310e+00]]
pcov_exp_2 
[[  1.38338049e-03  -7.39204594e-07  -7.81208814e-04]
 [ -7.39204594e-07   8.99295434e-09   1.92970700e-06]
 [ -7.81208814e-04   1.92970700e-06   9.14746758e-04]]

Đây là một ví dụ về những gì tôi đang làm:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize

def exp_func(x, a, b, c):
    return a * np.exp(-b * x) + c

def exp_squared_func(x, a, b, c):
    return a * np.exp(-b * x*x*x) + c

def linear_func(x, a, b):
    return a*x + b

def main():
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], np.float)
    y = np.array([1, 1, 1, 1, 0.805621, 0.798992, 0.84231, 0.728796, 0.819471, 0.570414, 0.355124, 0.276447, 0.159058, 0.0762189, 0.0167807, 0.0118647, 0.000319948, 0.00118267, 0, 0, 0], np.float)

    p0 = [0.7746042467213462, 0.10347274384077858, -0.016253458007293588]
    popt_lin, pcov_lin      = scipy.optimize.curve_fit(linear_func, x, y)
    popt_exp, pcov_exp      = scipy.optimize.curve_fit(exp_func, x, y)
    popt_exp_2, pcov_exp_2  = scipy.optimize.curve_fit(exp_squared_func, x, y)

    plt.figure()
    plt.plot(x, y, 'ko', label="Original data")
    plt.plot(x, linear_func(x, *popt_lin), 'r-', label='linear')
    plt.plot(x, exp_func(x, *popt_exp), 'b-', label='exponential')
    plt.plot(x, exp_squared_func(x, *popt_exp_2), 'g-', label='exponential squared')
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

Thật tuyệt khi bạn liên kết với câu hỏi CV đó và do đó, với chủ đề bình luận quan trọng (b / w rolando2, Frank Harrell, ...) đặt câu hỏi liệu có phù hợp để chọn mô hình bài thực tế dựa trên sự phù hợp hay không. Có lẽ tốt hơn là sử dụng kiến ​​thức trước về hệ thống để chọn mô hình.
Aman

Câu hỏi khác này trên CV có thể hữu ích: stats.stackexchange.com/questions/50830/iêu
Aman

Điều này có thể hữu ích để hiểu cách diễn giải các số liệu thống kê ma trận đồng phương.stackexchange.com/questions/10795/ mẹo - Tôi sẽ nói giá trị của các mô hình thứ ba nhỏ hơn, biểu thị độ lệch ít hơn.
dùng4581

Câu trả lời:


4

Để làm rõ, biến pcovtừ scipy.optimize.curve_fitlà hiệp phương sai ước tính của ước lượng tham số, nói một cách lỏng lẻo, được cung cấp dữ liệu mô hình, có bao nhiêu thông tin trong dữ liệu để xác định giá trị của tham số trong mô hình đã cho. Vì vậy, nó không thực sự cho bạn biết nếu mô hình được chọn là tốt hay không. Xem thêm này .

Vấn đề một mô hình tốt thực sự là một vấn đề khó khăn. Theo lập luận của các nhà thống kê

Tất cả các mô hình đều sai, nhưng một số hữu ích

Vì vậy, các tiêu chí để sử dụng so với các mô hình khác nhau phụ thuộc vào những gì bạn muốn đạt được.

Chẳng hạn, nếu bạn muốn một đường cong "gần nhất có thể" với dữ liệu, bạn có thể chọn một mô hình cung cấp số nhỏ nhất . Trong trường hợp của bạn, nó sẽ là mô hình funcvà các tham số ước tính poptcó giá trị thấp nhất khi tính toán

numpy.linalg.norm(y-func(x, *popt))

Tuy nhiên, nếu bạn chọn một mô hình có nhiều tham số, phần dư sẽ tự động giảm , với chi phí phức tạp hơn cho mô hình. Vì vậy, sau đó nó trở lại với những gì mục tiêu của mô hì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.