Chinaunix

标题: perl下面使用LBFGS优化算法问题 [打印本页]

作者: justu78    时间: 2016-12-28 11:12
标题: perl下面使用LBFGS优化算法问题
我要用perl写一个优化程序,提取一个复杂函数中的参数(大于100个),函数计算出来的曲线用于拟合实测曲线,现在我找到一个孙磊写的优化算法LBFGS的模块,其中有一个关键问题是,传递给优化算法的数据里面其他都好办,但是它还需要函数的梯度,这就让我很头疼,因为我的函数不是像y=a*x^2+b*x+c这么简单,可以直接在代码里把梯度y'=2*a*x+b,算出来写在代码里。我用的这个函数,人工根本就不可能写出梯度的公式。这个复杂函数的计算也不是人工或者perl代码完成的,是要靠一个专业仿真软件来计算函数值。所以我现在很头疼怎么传递函数的梯度给LBFGS这个优化模块,有用过的朋友能指点一下吗?谢谢。

作者: 大米白面    时间: 2016-12-28 14:53
如果目标是为了确定一组参数,使函数曲线最大限度地接近实测曲线,同时,经验公式难以逐项示导的话,不妨换换思路,用基因算法来实现。
作者: justu78    时间: 2016-12-28 17:03
大米白面 发表于 2016-12-28 14:53
如果目标是为了确定一组参数,使函数曲线最大限度地接近实测曲线,同时,经验公式难以逐项示导的话,不妨换 ...

基因算法不需要提供梯度信息吗?就不知道基因算法收敛速度,精度如何,perl里面有模块吗?我想用lbfgs的原因是看了介绍,对这种非线性的曲线拟合,现在bfgs是主流,我自己在一些商业软件里也用过,感觉还可以,就不是不知道他们怎么在内部实现复杂函数的梯度计算传递的。
我现在唯一想到的一个梯度计算办法就是:比如我有100个参数,我每次对一个参数当前值加一个小的扰动量(其他参数值不变),然后通过仿真软件计算这个函数的变化量,从而得到这个参数的函数梯度,这样来的话,需要100次,然后传递给优化器。这还只是一次传递,优化器在优化的过程中要迭代很多很多次,每次都要这样的话,那不知道要什么时候才能出结果了。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2