【发布时间】:2012-06-02 00:16:11
【问题描述】:
我试图在 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 顺便说一句的语言,但是快速的 google 结果也检索到此功能。我的 MATLAB 也可以调用。
2) 我的问题有一个凸误差面,它的误差面处处可微。
3) 我只能访问 fminsearch、fminbnd(我不能使用它,因为这个问题是多变量的而不是单变量的),所以剩下 fminsearch。 谢谢!
【问题讨论】:
-
如果我没记错的话,这与斯坦福大学的在线 ML 课程有关。如果我没记错的话,
fmincg不是 MATLAB 附带的函数,而是作为作业的一部分提供的。因此,您不能指望他们实现完全相同的算法。查看此page 以了解 FMINSEARCH 算法。 -
不管怎样,
fminsearch在octave-forge 中实现 -
@Amro 是的,它来自课堂。我不希望它们是相同的 - 但是主要问题是 fminsearch 根本无法正常工作,我正试图找出原因。问题是凸的并且在任何地方都是可微的,所以我不知道为什么它根本不起作用......我想做的不是必须使用/依赖 Octave 的函数,而是使用我的原生 MATLAB 函数,如 fminsearch。
-
好吧,我刚查了一下,班上有一条评论说“fmincg的工作方式与fminunc类似,但在处理大量参数时效率更高”。同样正如@eakbas 解释的那样,虽然
fminsearch确实用于解决非线性无约束优化,但它使用“无导数”方法(单纯形算法),这与fminunc所做的不同(它需要函数的梯度,或者它使用有限差分计算近似值)
标签: matlab octave mathematical-optimization