Python Scipy&x27;s fmin仅在inf上粘住,有时也会粘住

Python Scipy&x27;s fmin仅在inf上粘住,有时也会粘住,python,scipy,Python,Scipy,我在用Scipy's来计算分布与某些数据拟合的可能性的对数。我使用fmin搜索使对数可能性最大化的参数,如下所示: j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True) (似然度计算器获取数据和参数,并为每个数据点吐出一组似然值。) 如果我们开始搜索时使用的参数产生的似然值为0,则loglikelike为-inf,因此-sum为inf。fmin应远离初始参数,但它

我在用Scipy's来计算分布与某些数据拟合的可能性的对数。我使用fmin搜索使对数可能性最大化的参数,如下所示:

j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True)
(似然度计算器获取数据和参数,并为每个数据点吐出一组似然值。)

如果我们开始搜索时使用的参数产生的似然值为0,则loglikelike为-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将离开zeroland并开始搜索。
也许你的更新回答了这个问题。由于
fmin
使用下坡梯度算法,因此它在初始猜测的邻域中搜索最陡下降方向。如果你深入到一个参数区域,函数总是返回
inf
,那么算法就看不到该往哪个方向走。

似乎就是这样。由于数组中只有一些数据点返回0(然后将整个
sum
设置为
inf
),因此我将零设置为
sys.float\u info.min
,这对于本用例来说足够准确。这意味着整个数据点数组返回了一个连贯的、非
inf
-sum(log(likelion))
,它有一个梯度
fmin
可以搜索