Почему функция подбора кривой не объединяет все точки данных.Как получить наилучшую форму? - PullRequest
0 голосов
/ 06 июля 2019

Я не знаком, что, как определить функцию подгонки? Но, взглянув на тенденцию точек данных, я выбрал распределение Пуассона в качестве своей подходящей функции. Зеленая кривая довольно гладкая, но подходящая кривая находится далеко от первой точки данных, имеющей положение (0,0,55). Я хочу получить плавную кривую, используя функцию подгонки, потому что она далека от моих фактических данных. Я пытался увеличить количество бинов, но все еще получал тот же тип кривой. Я сомневаюсь, что, может быть, я не выбираю правильную функцию подгонки или, может быть, я что-то упускаю?

`def Poisson_fit(x,a):
    return (a*np.exp(-x))
def Poisson(x):
    return (np.exp(-x))
x_data =np.linspace(0,5,10)
print("x_data: ",x_data)
[0.,0.55555556, 1.11111111, 1.66666667, 2.22222222, 2.77777778, 3.33333333, 
3.88888889, 4.44444444, 5.]

hist, bin_edges= np.histogram(x, bins=10, density=True)
print("hist: ",hist)
#hist:[5.41041394e-01,1.42611032e-01,3.44975130e-02,7.60221121e-03,
 1.66115522e-03,3.26808028e-04,6.70741368e-05,1.14168743e-05,5.70843717e-06, 
1.42710929e-06]
plt.scatter(x_data, hist,marker='o',color='red')

popt, pcov = optimize.curve_fit(Poisson_fit, x_data, hist)
plt.plot(x_data, Poisson_fit(x_data,*popt), linestyle='--', 
marker='.',color='red', label='Fit')

plt.plot(x_data,Poisson(x_data),marker='.',color='green',label='Poisson')`

enter image description here

#Second Graph(Find best fit)

На следующем графике я поместил два разных распределения по точкам данных. Для меня трудно судить, что лучше всего подходит. Должен ли я печатать ошибку на функции подбора, чтобы определить наилучшую подгонку?

`perr = np.sqrt(np.diag(pcov))`

enter image description here

1 Ответ

0 голосов
/ 07 июля 2019

Если все точки данных должны совпадать с интерполяционной подгонкой, можно использовать сплайны (например, кубические сплайны ), обычно , что приводит к достаточно гладкой подгонке (только )обычно , потому что то, что является «достаточно гладким», зависит как от данных, так и от приложения).

Пример:

import numpy as np
from scipy.interpolate import CubicSpline
import pylab
x_data = np.linspace(0,5,10)
y_data = np.array([5.41041394e-01,1.42611032e-01,3.44975130e-02,
                   7.60221121e-03,1.66115522e-03,3.26808028e-04,
                   6.70741368e-05,1.14168743e-05,5.70843717e-06, 
                   1.42710929e-06])

spline = CubicSpline(x_data, y_data)

plot_x = np.linspace(0,5,1000)
pylab.plot(x_data, y_data, 'b*', label='Data')
pylab.plot(plot_x, spline(plot_x), 'k-', label='Spline')
pylab.legend(loc='best')
pylab.show()

Cubic spline fit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...