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

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


(likelihood_calculator接受数据和参数,并为每个数据点吐出一组似然值。)

如果我们从产生可能性为0的参数开始搜索,则对数似然为-inf,因此-sum为inf。 fmin应该远离初始参数,但它将停留在该值上以获得最大调用次数,然后返回该值:

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


我以为这可能是fmin处理infs的问题,但是如果我们删除似然计算器并直接递给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

最佳答案

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

关于python - Scipy的fmin有时仅在inf上停留,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7534653/

10-12 19:05