在Python中,我有一个函数error_p,它计算一组观测概率(或更准确地说,归一化频率)与给定均值的泊松分布之间的均方误差。
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
值范围内的图是:
显然,输入(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
找不到真正的最小值?
答案 0 :(得分:5)
如果您使用函数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)
你会发现它失败了。你的功能不适合于接收一系列输入并吐出一组输出,我认为这是最小化的。
答案 1 :(得分:5)
更改
theory = [poisson.pmf(x, mu) for x in x]
到
theory = poisson.pmf(x, mu)
它按预期工作。