Python fmin_bfgs未完成

Python fmin_bfgs未完成,python,debugging,optimization,scipy,regression,Python,Debugging,Optimization,Scipy,Regression,我正在尝试使用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终止了程序) 我只是想弄

我正在尝试使用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比较陌生),了解如何监视函数正在做什么

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

抱歉没有包含我试图最小化的-log似然函数,但它完全不可理解

非常感谢你的帮助


Zach

由于您没有向
fmin_bfgs
fmin_l_bfgs_b
提供梯度,因此每次需要梯度时,您的目标函数都会被评估
len(x)>7000次。如果目标函数的计算速度较慢,那么这将累加起来

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

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

在任何情况下,请尝试在此处提供可复制的测试用例。不管目标函数是否不可理解,重要的是感兴趣的人可以重现你遇到的情况

在我的系统中,即使对于7000个参数,我也看不到无限循环的问题。然而,对于一个简单的7000参数问题,函数求值计数约为200000,该问题具有
l_bfgs_b
,并且没有提供梯度。分析您的代码,看看这样的评估计数对您意味着什么。如果提供梯度,则为35(+35倍梯度)。提供梯度可能会有所帮助。(如果函数很复杂,自动区分可能仍然有效——Python中有相应的库。)

Python的其他优化库,请参见:(虽然不能说哪一个是最好的——ipopt或coin,或者值得一试)

供参考:Scipy中的L-BFGS-B实现就是这样一个(由应该知道自己在做什么的人编写):

您可以调试正在进行的操作,例如使用Python调试器
pdb
Python-m pdb-your_script.py
。或者只是在里面插入打印语句


还可以尝试谷歌“调试python”和“评测python”;)

由于您不向
fmin_bfgs
fmin_l_bfgs_b
提供梯度,因此每次需要梯度时,您的目标函数将被评估
len(x)>7000次。如果目标函数的计算速度较慢,那么这将累加起来

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

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

在任何情况下,请尝试在此处提供可复制的测试用例。不管目标函数是否不可理解,重要的是感兴趣的人可以重现你遇到的情况

在我的系统中,即使对于7000个参数,我也看不到无限循环的问题。然而,对于一个简单的7000参数问题,函数求值计数约为200000,该问题具有
l_bfgs_b
,并且没有提供梯度。分析您的代码,看看这样的评估计数对您意味着什么。如果提供梯度,则为35(+35倍梯度)。提供梯度可能会有所帮助。(如果函数很复杂,自动区分可能仍然有效——Python中有相应的库。)

Python的其他优化库,请参见:(虽然不能说哪一个是最好的——ipopt或coin,或者值得一试)

供参考:Scipy中的L-BFGS-B实现就是这样一个(由应该知道自己在做什么的人编写):

您可以调试正在进行的操作,例如使用Python调试器
pdb
Python-m pdb-your_script.py
。或者只是在里面插入打印语句


还可以尝试谷歌“调试python”和“评测python”;)

7000个参数太多了!fmin正在尝试评估您的功能,以了解所有这些功能的变化,这可能就是它花费如此长时间的原因。当然,对于7000个变量,可能存在许多局部极小值。我的建议是尝试一些PCA来降低问题的维数。这是很多!但它是完全凸的,所以没有局部极小值…7000个参数太多了!fmin正在尝试评估您的功能,以了解所有这些功能的变化,这可能就是它花费如此长时间的原因。当然,对于7000个变量,可能存在许多局部极小值。我的建议是尝试一些PCA来降低问题的维数。这是很多!但它是完全凸的,所以没有局部极小值…谢谢,我没有意识到maxfunc不计算梯度估计。我可以提供一个梯度函数。它本身相当慢,但必须比近似值快!谢谢,我不知道maxfunc不计算梯度估计。我可以提供一个梯度函数。它本身相当慢,但必须比近似值快!
***