在python中,我有一个函数error_p,它计算一组观测概率(或者更准确地说,标准化频率)和给定平均值的poisson分布之间的均方误差。

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

此函数在mu值范围内的曲线图(误差_p)为:
很明显,在输入(mu)值略低于2时有一个最小值。但是,当我这样调用scipy.optimize.minimize时:
results = minimize(error_p, 2, tol=0.00001)
results['x'], results['fun']

我明白了
(array([ 13.86128699]), 0.007078183160196419)

表示mu=13.86时的最小值,函数值为~0.007,而如果我运行
error_p(2)

我明白了
0.000848142902892

为什么没有找到真正的最小值?

最佳答案

如果使用scipy.optimize.minimize_scalar函数,将得到预期结果:

results = minimize_scalar(error_p, tol=0.00001)
print results['x'], results['fun']
>>> 1.88536329298 0.000820148069544

为什么scipy.optimize.minimize不起作用?我猜你的函数error_p是从一个麻木的角度变形的。试试这个:
MU = np.linspace(0,20,100)
error_p(MU)

你会发现它失败了。您的函数并不是专门为接收一个输入数组并输出一个输出数组而定制的,我认为minimize正在寻找这个函数。

10-05 18:15