我试图在MATLAB和Octave中的两个函数之间找到一个简单优化问题的一致答案。这是我的代码:
options = optimset('MaxIter', 500 , 'Display', 'iter', 'MaxFunEvals', 1000);
objFunc = @(t) lrCostFunction(t,X,y);
[result1] = fminsearch(objFunc, theta, options);
[result2]= fmincg (objFunc, theta, options);
(请记住,X,y和theta是先前定义的并且是正确的)。问题如下:当我使用fmincg(推荐fminsearch)在MATLAB中运行上面的代码时,我得到了正确的答案。
但是,如果我注释掉fmincg并让我们运行fminsearch,那么我无法进行任何转换。实际上输出看起来像这样:
491 893 0.692991 reflect
492 894 0.692991 reflect
493 895 0.692991 reflect
494 896 0.692991 reflect
495 897 0.692991 reflect
496 898 0.692991 reflect
497 899 0.692991 reflect
498 900 0.692991 reflect
499 901 0.692991 reflect
500 902 0.692991 reflect
Exiting: Maximum number of iterations has been exceeded
- increase MaxIter option.
Current function value: 0.692991
增加迭代次数并不是杰克。相比之下,当使用fmincg时,我看到它会聚,它最终给了我正确的结果:
Iteration 1 | Cost: 2.802128e-001
Iteration 2 | Cost: 9.454389e-002
Iteration 3 | Cost: 5.704641e-002
Iteration 4 | Cost: 4.688190e-002
Iteration 5 | Cost: 3.759021e-002
Iteration 6 | Cost: 3.522008e-002
Iteration 7 | Cost: 3.234531e-002
Iteration 8 | Cost: 3.145034e-002
Iteration 9 | Cost: 3.008919e-002
Iteration 10 | Cost: 2.994639e-002
Iteration 11 | Cost: 2.678528e-002
Iteration 12 | Cost: 2.660323e-002
Iteration 13 | Cost: 2.493301e-002
.
.
.
Iteration 493 | Cost: 1.311466e-002
Iteration 494 | Cost: 1.311466e-002
Iteration 495 | Cost: 1.311466e-002
Iteration 496 | Cost: 1.311466e-002
Iteration 497 | Cost: 1.311466e-002
Iteration 498 | Cost: 1.311466e-002
Iteration 499 | Cost: 1.311466e-002
Iteration 500 | Cost: 1.311466e-002
这给出了正确的asnwer。
那是什么给出的?为什么fminsearch不能在这种最小化情况下工作?
附加背景:
1)Octave是具有fmincg btw的语言,但是快速google结果也会检索此功能。我的MATLAB可以调用。
2)我的问题有一个凸的误差表面,它的误差表面到处都是可区分的。
3)我只能访问fminsearch,fminbnd(我不能使用,因为这个问题是多变量而不是单变量),所以离开了fminsearch。 谢谢!
答案 0 :(得分:6)
我假设fmincg正在实现共轭梯度类型优化。 fminsearch是一种无衍生优化方法。那么,为什么你期望他们给出相同的结果。它们是完全不同的算法。
我希望fminsearch能够找到凸成本函数的全局最小值。至少,这是我迄今为止的经验。
fminsearch输出的第一行表明objFunc(theta)为~0.69,但这个值与fmincg输出中的成本值非常不同。所以,我会在fminsearch之外寻找可能的错误。确保您为两种算法提供相同的成本函数和初始点。
答案 1 :(得分:1)
这个问题我有时会注意到这个算法。它可能不是您正在寻找的答案,但在这些情况下,似乎对我有用的是修改它终止的容差值。我看到的是两点之间的振荡提供了相同的结果。我知道这发生在LabView中,并且只能推测它发生在Matlab中。
除非我看到你的数据,否则我不能发表更多评论,但这就是我的建议。
注意:通过增加容差,目标是在算法到达该状态之前捕获算法。它变得不那么精确,但通常有效数字的数量相当小。