我使用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'也是如此。我不知道这个问题是否与前一个问题有关。
答案 0 :(得分:49)
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个月太晚了。为了将来的缘故,我把它放在这里。
答案 1 :(得分:1)
正如Wilmer E. Henao在回答中指出的那样,问题可能出在梯度上。由于您使用的是(const char)*
,因此梯度是通过数值计算的。在这种情况下,减小approx_grad=True
的值(这是用于数字计算梯度的步长)会有所帮助。
答案 2 :(得分:1)
使用L-BFGS-B优化器,我也收到错误“ ABNORMAL_TERMINATION_IN_LNSRCH”。
当我的梯度函数指向正确的方向时,我通过其L2范数重新调整了函数的 actual 梯度。删除它或添加其他适当类型的重新缩放即可。以前,我猜想梯度太大了,以至于马上就超出了范围。
如果我正确阅读,那么来自OP的问题将不受限制,因此这当然对解决此问题没有帮助。但是,搜索错误“ ABNORMAL_TERMINATION_IN_LNSRCH”会将该页面作为第一个结果之一,因此它可能会对其他人有所帮助...