Я подгоняю функцию синуса к пуассоновским распределенным данным, где синус - это значение ожиданияВ настоящем коде Python я пытаюсь восстановить период моделируемых данных.Я использую logpmf Пуассона, который затем должен быть сведен к минимуму.Я правильно использую logpmf?Я получаю много NaN в LL при печати шагов минимизации.
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
from scipy.optimize import minimize
p_start=[100.,1.,.5,100]
x = np.linspace(0., 10., 201)
def sinefunction(xArg,amp,per,shift,offset):
return offset + amp * np.sin(shift + xArg/per)
def residual(pars):
model = sinefunction(x,pars[0],pars[1],pars[2],pars[3])
LL = -np.sum( stats.poisson.logpmf(data, model))
return LL
data0 = sinefunction(x,p_start[0],p_start[1],p_start[2],p_start[3])
guess = [100.,1.0, 0.5,100.]
periods=[]
for rndseed in range(200):
np.random.seed(rndseed)
noise=[]
for i in range(len(x)):
noise.append(np.random.poisson(data0[i]))
data = np.array(noise)
out = minimize(residual, guess, tol=10**-5,method='Nelder-Mead')
estParms = out.x
periods.append(estParms[1])
n, bins, patches = plt.hist(periods, 20, normed=1)
plt.show()
Если я печатаю LL, я получаю конечный результат около 200 * pi.