我正在尝试使用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终止了程序)。
我只想弄清楚该功能可能出现的问题。似乎它可能会陷入一段时间的循环中。有谁遇到过这个问题?如果没有,我也可以在这里使用一些常规调试帮助(因为我对Python比较新)关于如何监视函数正在做什么。
最后,也许有人可以为我正在尝试的任务推荐不同的功能或包。我试图将套索正则Poisson回归拟合为稀疏数据,对7000个变量进行大约1200万次观测。
PS抱歉不包括我试图最小化的-log似然函数,但它将完全无法解释。
非常感谢您的帮助!
扎克
答案 0 :(得分:3)
由于您没有向fmin_bfgs
和fmin_l_bfgs_b
提供渐变,因此每次需要渐变时,您的目标函数都会被评估len(x) > 7000
次。如果目标函数的评估速度很慢,那就会加起来。
maxfun
选项显然没有计算梯度估计,因此它可能实际上不是无限循环,只需花费很长时间。
你是什么意思“python告诉我它必须终止程序”?
请在任何情况下尝试在此提供可重现的测试用例。目标函数是否难以理解并不重要 - 重要的是感兴趣的人可以重现你遇到的情况。
即使是7000个参数,我的系统也看不到无限循环问题。但是,l_bfgs_b
的简单 7000参数问题的函数评估计数约为200000,并且未提供梯度。描述您的代码,看看这些评估计数对您意味着什么。提供渐变,它是35(梯度的+ 35倍)。然后提供梯度可能会有所帮助。 (如果函数很复杂,自动区分可能仍然有效 - 在Python中有用于此的库。)
Python的其他优化库,请参阅:http://scipy.org/Topical_Software(不能说哪个是最好的,但是 - ipopt或者硬币 - 或者值得一试)
供参考:Scipy中的L-BFGS-B实现就是这个(并且是由应该知道他们在做什么的人编写的): http://users.eecs.northwestern.edu/~nocedal/lbfgsb.html
***
你可以调试正在发生的事情,例如使用Python调试器pdb
,python -m pdb your_script.py
。或者只是在其中插入print语句。
还尝试使用Google“debug python”和“profile python”;)