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ừ 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()