根据您所说的:我假设您必须针对50个变量进行优化;我还假设您遇到的情况是,找到解析导数非常昂贵(更不用说获取数值了),并且您的优化不受限制。
让我强调一下,不幸的是,当在大型或小型优化例程之间进行选择时,您会在25-30到100个变量之间造成一些微弱的影响。话虽如此,什么也没有丢失。
考虑到即使一阶导数也很昂贵,要想摆脱这种情况就扼杀了牛顿方法的思想。您可能会对准牛顿(BFGS)感到满意,但是如果您的粗麻布有点像对角线。CG通常比BFGS慢一些,因此可能不会带来很多改善。如果内存也是一个问题,请使用它(或者在这种情况下只使用L-BFGS)。此外,鉴于评估功能的速度有多慢,最简单的下降/直线搜索算法将非常缓慢。模拟退火和其他随机搜索变体也是如此(我假设您无权访问HMC和所有爵士乐)。
因此,当您需要对单个功能进行评估时需要最大的收益时:使用Powell的方法并测试COBYLA。尽管它是一种受约束的优化算法,因为它会内部线性地逼近函数的梯度来加快速度,但是它将能够利用函数的线性。也一定要尝试NLopt for Python。他们有很多没有梯度的优化器。尝试UOBYQA;这也是鲍威尔的创意(通过二次逼近进行无约束的优化)。
非常简单:N-CG算法依赖于计算Hessian,而您的Hessian似乎非常昂贵。NLCG和BFGS不需要它,尽管他们可能会在第一步中尝试对其进行一次计算。
我故意省略了单纯形算法,因为它是完全不同的野兽。与渐变本身无关。尝试一下,但是我不能对此发表评论。这实际上取决于您问题的性质。
对于数值优化的第一个很好的参考,CTKelly的书《迭代的优化方法》将带给您相当不错的帮助。