Python свести к минимуму для синуса, я правильно использую logpmf? - PullRequest
0 голосов
/ 24 апреля 2019

Я подгоняю функцию синуса к пуассоновским распределенным данным, где синус - это значение ожиданияВ настоящем коде 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.

...