fmin_bfgs不完整
我想尽量减少使用fmin_bfgs()或fmin_l_bfgs_b()大量参数(超过7000)的函数。当我输入命令fmin_bfgs不完整
opt_pars = fmin_l_bfgs_b(obj_f, pars, approx_grad=1)
(其中obj_f是我试图尽量减少和收杆是初始参数的向量函数)的功能只是一直运行,直到蟒蛇告诉我,它已经终止程序。从来没有任何输出。我尝试添加参数maxfunc = 2来查看它是否在任何地方发生,并发生了同样的事情(永远运行,然后python终止程序)。
我只是想弄清楚该函数可能会出现什么问题。看起来也许它正陷入一段时间的循环之中。有没有人遇到过这个问题?如果不是的话,我也可以在这里使用一些通用的调试帮助(因为我对Python比较陌生)如何监视函数的功能。
最后,也许有人可以为我尝试的任务推荐一个不同的函数或包。我试图拟合一个套索正规化的泊松回归来稀疏数据,其中有大约1,200万个观察7000个变量。
PS对不起,我不想包括-log似然函数,我试图尽量减少,但它将是完全不可解释的。
非常感谢您的帮助!
扎克
既然你不提供梯度,以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或硬币或可能是值得一试)
参考:在L-在SciPy的BFGS-B实现这一个(由谁应该写的家伙知道他们在做什么): http://users.eecs.northwestern.edu/~nocedal/lbfgsb.html
***
可以调试什么是对如去通过使用Python调试器pdb
,python -m pdb your_script.py
。或者只需在其中插入打印语句。
也试试谷歌“调试python”和“profile python”;)
谢谢,我没有意识到maxfunc不计算梯度估计。我有一个我可以提供的渐变功能。它本身非常慢,但必须比近似值更快! – zss
7000参数很多! fmin试图评估你所有这些变体的功能,这可能是为什么它需要这么长时间。当然,有7000个变量可能会有很多局部最小值。我的建议是尝试一些PCA来减少问题的维度。 – tiago
这是很多!但它是完全凸的,所以没有局部最小值... – zss