ฉันไม่ค่อยเก่งเรื่องสถิติดังนั้นขอโทษถ้านี่เป็นคำถามง่าย ๆ ฉันกำลังกระชับโค้งให้ข้อมูลบางส่วนและบางครั้งข้อมูลของฉันพอดีดีที่สุดชี้แจงเชิงลบในรูปแบบ* E ( - ข* x ) + Cและบางครั้งพอดีอยู่ใกล้กับ* E ( - ข* x 2 ) +ค อย่างไรก็ตามบางครั้งทั้งสองล้มเหลวและฉันต้องการที่จะถอยกลับไปเป็นแบบเชิงเส้น คำถามของฉันคือฉันจะทราบได้อย่างไรว่าแบบจำลองใดที่เหมาะกับข้อมูลชุดใดชุดหนึ่งที่ดีที่สุดจากเมทริกซ์ความแปรปรวนร่วม - ความแปรปรวนร่วมที่ส่งคืนจากฟังก์ชั่นscipy.optimize.curve_fit () ? ฉันเชื่อว่าความแปรปรวนเป็นหนึ่งในเส้นทแยงมุมของเมทริกซ์นี้ แต่ฉันไม่แน่ใจว่าจะตีความมันอย่างไร
UPDATE: ตามคำถามที่คล้ายกันฉันหวังว่าเมทริกซ์ความแปรปรวนร่วมแปรปรวนสามารถบอกได้ว่าแบบจำลองใดที่ฉันพยายามดีที่สุดเหมาะกับข้อมูล (ฉันพยายามใส่ชุดข้อมูลจำนวนมากกับหนึ่งในสามรุ่นนี้)
เมทริกซ์ที่ได้จะมีลักษณะเช่นนี้สำหรับตัวอย่างที่กำหนด:
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]]
นี่คือตัวอย่างของสิ่งที่ฉันทำ:
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()