Как использовать ошибки curve_fit? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь понять ошибки из Curve_Fit и был бы признателен, если бы кто-нибудь мог просмотреть мой код и сообщить, правильно ли я понял обработку ошибок. Моя цель состоит в том, чтобы взять наблюдаемые, подогнать полином, а затем использовать параметры подгонки, использовать их для прогнозирования значений. Ключом к моей необходимости является не только прогнозируемое значение, но и мера ошибки для значения (y). Я думаю, что я понял выходные данные стандартных ошибок из параметров curve_fit, и в моем понимании я использую их, чтобы вычислить стандартное отклонение для прогнозируемого значения (y). Опять же, в моем понимании, ошибка, которую я вычислил, является стандартной ошибкой «1 * сигма», и одна сигма будет содержать 68% разбросанных показаний, предполагающих нормальное распределение. Правильно ли я понял это и правильно ли использовал выходные данные из Curve_Fit для доставки? Ниже приведено некоторое подтверждение концепции кода.

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
import random

#####function
def dfunc(x, a, b, c):
   return a*x*x + b*x + c  

#Set up trial data
knt=20
ANAL = np.zeros((3,knt))
rand = 20     #% randomization in trial   data
for i in range(0,knt):
  ANAL[0,i] = i
  ANAL[1,i] = dfunc(i,1,2,3)*random.randint(100-rand/2,100+rand/2)/100

#fit, determine parameters values and errors
dprm, dpcv = curve_fit(dfunc, ANAL[0,],ANAL[1,])
dgcv = np.sqrt(np.diag(dpcv))
print ("Parameter values a,b,c: %5.2f %5.2f %5.2f"
   % (dprm[0],dprm[1],dprm[2]))
print ("Parameter standard err: %5.2f %5.2f %5.2f"
   % (dgcv[0],dgcv[1],dgcv[2]))

#Utilize to predict "y std err" for x in range 0-20 
for x in range(0,20):
  ANAL[2,x]=dfunc(x,*dgcv)
  print ("For x=%5.2f  y=%6.2f with y std err(%6.2f)"
     % (x,ANAL[1,x],ANAL[2,x]))


plt.plot(ANAL[0,], ANAL[1,], 'r+', label='trial data')  
plt.plot(ANAL[0,], dfunc(ANAL[0,], *dprm), 'b-', label='best fit')
plt.errorbar(ANAL[0,],  dfunc(ANAL[0,], *dprm), yerr=ANAL[2,],linestyle="none")
plt.xlabel('value x')
plt.ylabel('y observations')
plt.legend()
plt.show()
...