繁体   English   中英

为什么scipy.optimize如此严重地依赖初始值?

[英]Why does scipy.optimize rely so heavily on start values?

我正在尝试使用scipy.optimize进行一些简单的优化问题,但是我发现只能找到起始值范围非常有限的解决方案。 这是一个最小的可复制示例:

import numpy as np
import scipy.stats as st
from scipy.optimize import minimize

p = np.linspace(0, 1, 100)
neg_likelihood = lambda p: -1 * st.binom.pmf(6, n=9, p=p)
minimize(neg_likelihood, 0.3)

neg_likelihood函数的形状如下图所示,因此正确答案应该在0.65左右:

在此处输入图片说明

尝试不同的起始值,我发现只有在p起始值介于0.10.4之间时才能找到正确的解决方案。 最小化算法似乎非常不稳定。

我尝试了几种不同的最小化算法(BFGS,Powell等),它们产生了相似的结果,所以我想问题一定是我的,而不是算法的问题。

标准的数值优化例程使用函数值(要优化的值)和梯度(函数的大致横向信息)。

您仅提供了该功能。 因此,优化例程必须近似梯度。 只要您可以计算梯度,就添加此信息源,而不依赖于近似值。

在这里,我手动进行数学运算,并且不使用统计信息中的函数。 对数变换使计算梯度更加容易。

import numpy as np
from scipy.optimize import fmin_l_bfgs_b

# do the math by hand, it's quite simple in this case
def target_fun(p, k, n):
    f = - k* np.log(p) - (n-k)*np.log(1-p)
    g =  - k/p + (n-k) / (1-p)
    return f, g

f = lambda p: target_fun(p, k=6, n=9)
epsilon = 1e-9
fmin_l_bfgs_b(f, 0.999, bounds=[(epsilon,1-epsilon)])

添加梯度信息时,优化例程会成功找到任意起始值的最优值。

问题在于,对于[0,1]之外的x ,您的函数未定义(返回nan),优化器不喜欢此函数。

您可以尝试指定bounds=[(0,1)]选项,以告知优化器有关此的信息-nan返回值会导致端点处的梯度近似问题。

由于只有一个变量,因此可以对一维问题使用特殊的优化器,这些优化器仅访问范围内的值:

print minimize_scalar(neg_likelihood, bracket=(0, 0.5, 1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM