我正在使用 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)
如果我们使用零数组、这些零是 float 或者使用 fmin_bfgs,也会发生同样的正确行为。如果我们使用 fmin_bfgs,函数调用也会出现同样的错误行为,但如果我们从不产生 0 可能性(以及任何 infs)的参数开始,fmin 就会正确工作。
想法?谢谢!
更新:
如果有很大范围的参数导致为零,我们可以将参数值推到边缘。如果参数足够接近边缘,fmin 将离开零域并开始搜索。 前任。 p<1 = Inf,则在 p=.99 时 fmin 将起作用,但在 p=.95 时则不起作用
最佳答案
也许您的更新可以回答这个问题。由于 fmin 使用下坡梯度算法,因此它会在初始猜测的邻域中搜索最速下降的方向。如果您足够深入到函数始终返回 inf
的参数区域,那么算法就看不到该往哪个方向走。
关于python - Scipy 的 fmin 有时只粘在 inf 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7534653/