当前位置:  开发笔记 > 编程语言 > 正文

scipy.optimize.fmin_l_bfgs_b返回'ABNORMAL_TERMINATION_IN_LNSRCH'

如何解决《scipy.optimize.fmin_l_bfgs_b返回'ABNORMAL_TERMINATION_IN_LNSRCH'》经验,为你挑选了1个好方法。

我使用scipy.optimize.fmin_l_bfgs_b来解决高斯混合问题.混合分布的均值通过回归建模,其权重必须使用EM算法进行优化.

sigma_sp_new, func_val, info_dict = fmin_l_bfgs_b(func_to_minimize, self.sigma_vector[si][pj], 
                       args=(self.w_vectors[si][pj], Y, X, E_step_results[si][pj]),
                       approx_grad=True, bounds=[(1e-8, 0.5)], factr=1e02, pgtol=1e-05, epsilon=1e-08)

但有时我在信息词典中收到警告"ABNORMAL_TERMINATION_IN_LNSRCH":

func_to_minimize value = 1.14462324063e-07
information dictionary: {'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 147, 'grad': array([  1.77635684e-05,   2.87769808e-05,   3.51718654e-05,
         6.75015599e-06,  -4.97379915e-06,  -1.06581410e-06]), 'nit': 0, 'warnflag': 2}

RUNNING THE L-BFGS-B CODE

           * * *

Machine precision = 2.220D-16
 N =            6     M =           10
 This problem is unconstrained.

At X0         0 variables are exactly at the bounds

At iterate    0    f=  1.14462D-07    |proj g|=  3.51719D-05

           * * *

Tit   = total number of iterations
Tnf   = total number of function evaluations
Tnint = total number of segments explored during Cauchy searches
Skip  = number of BFGS updates skipped
Nact  = number of active bounds at final generalized Cauchy point
Projg = norm of the final projected gradient
F     = final function value

           * * *

   N    Tit     Tnf  Tnint  Skip  Nact     Projg        F
    6      1     21      1     0     0   3.517D-05   1.145D-07
  F =  1.144619474757747E-007

ABNORMAL_TERMINATION_IN_LNSRCH                              

 Line search cannot locate an adequate point after 20 function
  and gradient evaluations.  Previous x, f and g restored.
 Possible causes: 1 error in function or gradient evaluation;
                  2 rounding error dominate computation.

 Cauchy                time 0.000E+00 seconds.
 Subspace minimization time 0.000E+00 seconds.
 Line search           time 0.000E+00 seconds.

 Total User time 0.000E+00 seconds.

我不是每次都得到这个警告,但有时候.(大多数得到'CONVERGENCE:NORM_OF_PROJECTED_GRADIENT _ <= _ PGTOL'或'CONVERGENCE:REL_REDUCTION_OF_F _ <= _ FACTR*EPSMCH').

我知道这意味着在这次迭代中可以达到最小值.我用Google搜索了这个问题.有人说这种情况经常发生,因为客观和梯度函数不匹配.但是这里我没有提供渐变功能,因为我使用'approx_grad'.

我应该调查的可能原因是什么?"舍入误差支配计算"是什么意思?

======

我还发现对数似然不会单调增加:

########## Convergence !!! ##########
log_likelihood_history: [-28659.725891322563, 220.49993177669558, 291.3513633060345, 267.47745327823907, 265.31567762171181, 265.07311121000367, 265.04217683341682]

它通常在第二次或第三次迭代时开始减少,即使没有发生'ABNORMAL_TERMINATION_IN_LNSRCH'.我不知道这个问题是否与前一个问题有关.



1> Wilmer E. He..:

Scipy称之为原始的L-BFGS-B实现.这是一些fortran77(旧但美丽和超快的代码),我们的问题是下降方向实际上是上升.问题从第2533行开始(链接到底部的代码)

gd = ddot(n,g,1,d,1)
  if (ifun .eq. 0) then
     gdold=gd
     if (gd .ge. zero) then
c                               the directional derivative >=0.
c                               Line search is impossible.
        if (iprint .ge. 0) then
            write(0,*)' ascent direction in projection gd = ', gd
        endif
        info = -4
        return
     endif
  endif

换句话说,你要告诉它上山下山.代码在你提供的下降方向上尝试一次称为线搜索的东西总共20次,并且意识到你并没有告诉它下坡,而是上坡.全部20次.

写它的人(Jorge Nocedal,顺便说一句,他是一个非常聪明的人)放20,因为这已经足够了.机器epsilon是10E-16,我认为20实际上有点太多了.所以,对于遇到此问题的大多数人来说,我的钱是你的渐变与你的功能不匹配.

现在,也可能是"2.舍入误差主导计算".通过这个,他意味着你的功能是一个非常平坦的表面,其中增加的是机器epsilon的顺序(在这种情况下你可以重新调整功能),现在,我很兴奋,也许应该有第三种选择,当你的功能太奇怪了.振荡?我可以看到像$\sin({\ frac {1} {x}})$这样的问题.但我不是一个聪明人,所以不要假设有第三种情况.

所以我认为OP的解决方案应该是你的功能太平.或者看看fortran代码.

https://github.com/scipy/scipy/blob/master/scipy/optimize/lbfgsb/lbfgsb.f

这是对那些想要看到它的人的搜索.https://en.wikipedia.org/wiki/Line_search

注意.这是7个月太晚了.我把它放在这里是为了将来的缘故.


如果目标函数(或可能的梯度)变为“ nan”,也会打印此错误消息。
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有