Scipy的fmin只支持inf,只有时

问题描述:

我使用Scipy的fmin search来计算分布适合某些数据的可能性的对数。我使用FMIN来搜索最大化对数似然,像这样的参数:(likelihood_calculator取数据和参数,并吐出似然值的每个数据点的数组)Scipy的fmin只支持inf,只有时

j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True) 

如果我们用可能为0的参数开始搜索,则loglikelihood为-inf,所以-sum为inf。 FMIN应该运行从最初的参数了,而是它坚持对呼叫的最大数量的值,然后返回它:

In [268]: print j 
(array([ 1.5]), inf, 67, 200, 1) 

我想这也许是与FMIN的处理INF中的一个问题,但如果我们删除的可能性计算器和刚刚到手0直接,我们得到更好的行为:

In [269]: i = fmin(lambda p: -sum(log(p)), array([0]), full_output=1) 
Warning: Maximum number of function evaluations has been exceeded. 

In [270]: i 
Out[270]: (array([ 3.16912650e+26]), -61.020668415892501, 100, 200, 1) 

如果我们用零的数组,如果这些零花车,或者如果我们使用fmin_bfgs这同样正确的行为发生。如果我们使用fmin_bfgs,那么与函数调用相同的错误行为会继续,但如果我们从不产生0可能性(因此也不产生任何infs)的参数开始,fmin就会正确工作。

的思考?谢谢!

更新:

如果有过导致在零参数广阔的领域,我们可以把参数值到边缘。如果参数接近边缘,fmin将退出零点并开始搜索。例如, p = < 1 = Inf,则p = 0.99 fmin将起作用,但不是p = 0.95

也许你的更新回答了这个问题。由于fmin使用下坡梯度算法,因此它会在最初的猜测附近搜索最陡下降的方向。如果你足够深入到函数总是返回inf的参数区域,则该算法不能看到要去的方向。

+0

这似乎是它。因为只有数组中的一些数据点会返回0(然后将整个'sum'设置为'inf'),所以我将零设置为“sys.float_info.min”,这对于该用例来说足够精确。这意味着整个数据点阵列返回一个连贯的非''inf'' -sum(log(likelihood))',它有一个梯度'fmin'可以搜索 – jeffalstott