我正在使用Scipy的fmin search来计算分布适合某些数据的可能性的对数。我正在使用fmin来搜索最大化对数似然性的参数,如下所示:
j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True)
(likelihood_calculator获取数据和参数,并为每个数据点吐出一系列似然值。)
如果我们使用产生可能性为0的参数开始搜索,则loglikelihood为-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可能性的参数(因此任何inf)开始,则fmin正常工作。
思考?谢谢!
更新
如果有大量参数导致零,我们可以将参数值推到边缘。如果参数足够接近边缘,则fmin将离开零地并开始搜索。 防爆。 p< 1 = Inf,然后在p = .99 fmin将起作用,但不是在p = .95
答案 0 :(得分:3)
也许你的更新回答了这个问题。由于fmin
使用下坡梯度算法,因此它会在初始猜测的邻域中搜索最速下降的方向。如果你足够深入到函数总是返回inf
的参数区域,那么算法就无法看到要去的方向。