Ответ 1
Проблема с вашим кодом заключается в том, что вы не знаете, что такое возвращаемые значения curve_fit
. Его параметры для подгоночной функции и их ковариационной матрицы. Не то, что вы можете нарисовать напрямую.
Привязанные наименьшие квадраты Fit
В общем, вы не можете получить много, гораздо проще:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.misc import factorial
# get poisson deviated random numbers
data = np.random.poisson(2, 1000)
# the bins should be of integer width, because poisson is an integer distribution
entries, bin_edges, patches = plt.hist(data, bins=11, range=[-0.5, 10.5], normed=True)
# calculate binmiddles
bin_middles = 0.5*(bin_edges[1:] + bin_edges[:-1])
# poisson function, parameter lamb is the fit parameter
def poisson(k, lamb):
return (lamb**k/factorial(k)) * np.exp(-lamb)
# fit with curve_fit
parameters, cov_matrix = curve_fit(poisson, bin_middles, entries)
# plot poisson-deviation with fitted parameter
x_plot = np.linspace(0, 20, 1000)
plt.plot(x_plot, poisson(x_plot, *parameters), 'r-', lw=2)
plt.show()
Это результат:
Нераспределенный максимальный размер правдоподобия
Еще лучшая возможность - не использовать гистограмму вообще и вместо этого сделать максимальную правдоподобие.
Но при ближайшем рассмотрении даже это не нужно, поскольку оценка максимального правдоподобия для параметра пуассоновского распределения - среднее арифметическое.
Однако, если у вас есть другие, более сложные pdf файлы, вы можете использовать это в качестве примера:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from scipy.misc import factorial
def poisson(k, lamb):
"""poisson pdf, parameter lamb is the fit parameter"""
return (lamb**k/factorial(k)) * np.exp(-lamb)
def negLogLikelihood(params, data):
""" the negative log-Likelohood-Function"""
lnl = - np.sum(np.log(poisson(data, params[0])))
return lnl
# get poisson deviated random numbers
data = np.random.poisson(2, 1000)
# minimize the negative log-Likelihood
result = minimize(negLogLikelihood, # function to minimize
x0=np.ones(1), # start value
args=(data,), # additional arguments for function
method='Powell', # minimization method, see docs
)
# result is a scipy optimize result object, the fit parameters
# are stored in result.x
print(result)
# plot poisson-deviation with fitted parameter
x_plot = np.linspace(0, 20, 1000)
plt.hist(data, bins=np.arange(15) - 0.5, normed=True)
plt.plot(x_plot, poisson(x_plot, result.x), 'r-', lw=2)
plt.show()