В Python у меня есть функция error_p, которая вычисляет среднеквадратичную ошибку между набором наблюдаемых вероятностей (или, вернее, нормализованными частотами) и распределением Пуассона для данного среднего.Scipy.optimize.minimize возвращает неверные результаты
from scipy.stats import poisson
import numpy as np
from scipy.optimize import minimize
def error_p(mu):
"""
Returns mean squared error between observed data points and Poisson distribution
"""
data = np.array([17.0,32,20,19,6,5,7,5,0,1,3,1,1,0,0,0,0,1,0,0])
data = data/sum(data)
x = range(len(data))
theory = [poisson.pmf(x, mu) for x in x]
error = np.mean((data - theory)**2)
return error
График этой функции (error_p) в диапазоне mu
значений:
Очевидно, что есть минимум на входной величины (мю) чуть ниже 2. Однако, когда я называю scipy.optimize.minimize
так:
results = minimize(error_p, 2, tol=0.00001)
results['x'], results['fun']
Я получаю
(array([ 13.86128699]), 0.007078183160196419)
, указывающий минимум при мю = 13,86 с функцией величины ~ 0,007, тогда как, если я бегу
error_p(2)
я получаю
0.000848142902892
Почему scipy.optimize.minimize
не найти истинного минимума?
Добро пожаловать в переполнение стека! Я вложил ваше изображение и дал вам преимущество для хорошего первого вопроса - достаточно скоро вы сможете добавлять фотографии в свои собственные сообщения! – Hooked