python - Scipy 的 fmin 有时只粘在 inf 上

标签 python scipy

我正在使用 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/

相关文章:

python - Gunicorn 不会启动 Flask 应用程序,因为 "Application object must be callable"

python - 通过套接字将 C 结构读入 python

python - 求 1d 内给定区间内的所有根

image-processing - 如何使用 scipy.ndimage 找到最大的连通区域?

python - 偏微分方程中的时空参数 - 使用 Python 中的线法求解

python - 如何计算 Scipy 中稀疏矩阵列的方差?

Python3 deepcopy 类实例不起作用

python - Python中in关键字和__contains__的区别

python - 在转换为列表时,如何防止 Python 将两位数整数拆分为两个整数

python - 在 python 中从多元 pdf 中采样