5

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

4

2 回答 2

6

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

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

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

于 2012-05-27T01:10:35.343 回答
1

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

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

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

于 2012-05-27T02:24:18.703 回答