我试图在 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 在 MATLAB 中运行上面的代码时,(推荐 fminsearch),我得到了正确的答案。
但是,如果我注释掉 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
这给出了正确的答案。
那么给了什么?为什么 fminsearch 在这种最小化情况下不起作用?
附加上下文:
1) Octave 是具有 fmincg 顺便说一句的语言,但是快速的谷歌结果也检索到这个函数。我的 MATLAB 也可以调用。
2)我的问题有一个凸误差面,它的误差面处处可微。
3)我只能访问 fminsearch,fminbnd(我不能使用它,因为这个问题是多变量的而不是单变量的),所以离开 fminsearch。谢谢!