0

我正在尝试使用 fmin_bfgs() 或 fmin_l_bfgs_b() 最小化具有大量参数(略超过 7000)的函数。当我输入命令

 opt_pars = fmin_l_bfgs_b(obj_f, pars, approx_grad=1)

(其中 obj_f 是我要最小化的函数, pars 是初始参数的向量)该函数永远运行,直到 python 告诉我它必须终止程序。从来没有任何输出。我尝试添加参数 maxfunc = 2 以查看它是否到达任何地方并且发生​​了同样的事情(永远运行然后python终止了程序)。

我只是想弄清楚该功能可能出了什么问题。似乎它可能陷入了一个while循环或其他什么东西。有没有人遇到过这个问题?如果没有,我还可以在此处使用一些一般调试帮助(因为我对 Python 比较陌生)来了解如何监视函数正在执行的操作。

最后,也许有人可以为我正在尝试的任务推荐不同的功能或包。我正在尝试将套索正则化泊松回归拟合到稀疏数据,其中包含 7000 个变量的大约 1200 万个观测值。

PS很抱歉没有包括我试图最小化的-log似然函数,但这将是完全无法解释的。

非常感谢您的帮助!

扎克

4

1 回答 1

3

由于您不向fmin_bfgs和提供梯度,因此每次需要梯度时fmin_l_bfgs_b都会评估您的目标函数。len(x) > 7000如果目标函数的评估速度很慢,那将会累加。

maxfun选项显然没有计算梯度估计,因此它实际上可能不是无限循环,只是需要很长时间。

“python告诉我它必须终止程序”是什么意思?

无论如何,请尝试在此处提供可重现的测试用例。目标函数是否难以理解并不重要——重要的是感兴趣的人可以重现你遇到的情况。

即使对于 7000 个参数,我也没有在我的系统上看到无限循环问题。但是,对于一个简单的7000 参数问题,l_bfgs_b没有提供梯度,函数评估计数约为 200000。分析您的代码以查看此类评估计数对您意味着什么。提供梯度后,它是 35(+ 35 倍梯度)。提供渐变可能会有所帮助。(如果函数很复杂,自动微分可能仍然有效 --- Python 中有相应的库。)

Python 的其他优化库,请参阅:http : //scipy.org/Topical_Software (虽然不能说哪些是最好的 --- ipopt 或 coin-or 值得一试)

供参考:Scipy 中的 L-BFGS-B 实现是这个(由应该知道自己在做什么的人编写): http ://users.eecs.northwestern.edu/~nocedal/lbfgsb.html

***

您可以调试正在发生的事情,例如使用 Python 调试器pdbpython -m pdb your_script.py. 或者只是通过在其中插入打印语句。

也尝试谷歌“调试python”和“profile python”;)

于 2012-12-06T02:01:26.163 回答