Scipy.optimize.minimize返回不正确的结果

时间:2014-12-14 18:40:55

标签: python numpy scipy

在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值范围内的图是:

enter image description here

显然,输入(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找不到真正的最小值?

2 个答案:

答案 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)

它按预期工作。