MATLAB的'fminsearch'与Octave'fmincg'不同

时间:2012-05-27 01:04:30

标签: matlab octave mathematical-optimization

我试图在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。 谢谢!

2 个答案:

答案 0 :(得分:6)

我假设fmincg正在实现共轭梯度类型优化。 fminsearch是一种无衍生优化方法。那么,为什么你期望他们给出相同的结果。它们是完全不同的算法。

我希望fminsearch能够找到凸成本函数的全局最小值。至少,这是我迄今为止的经验。

fminsearch输出的第一行表明objFunc(theta)为~0.69,但这个值与fmincg输出中的成本值非常不同。所以,我会在fminsearch之外寻找可能的错误。确保您为两种算法提供相同的成本函数和初始点。

答案 1 :(得分:1)

这个问题我有时会注意到这个算法。它可能不是您正在寻找的答案,但在这些情况下,似乎对我有用的是修改它终止的容差值。我看到的是两点之间的振荡提供了相同的结果。我知道这发生在LabView中,并且只能推测它发生在Matlab中。

除非我看到你的数据,否则我不能发表更多评论,但这就是我的建议。

注意:通过增加容差,目标是在算法到达该状态之前捕获算法。它变得不那么精确,但通常有效数字的数量相当小。