【问题标题】:MATLABs 'fminsearch' different from Octave's 'fmincg'MATLAB 的“fminsearch”与 Octave 的“fmincg”不同
【发布时间】: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 算法。
  • 不管怎样,fminsearchoctave-forge 中实现
  • @Amro 是的,它来自课堂。我不希望它们是相同的 - 但是主要问题是 fminsearch 根本无法正常工作,我正试图找出原因。问题是凸的并且在任何地方都是可微的,所以我不知道为什么它根本不起作用......我想做的不是必须使用/依赖 Octave 的函数,而是使用我的原生 MATLAB 函数,如 fminsearch。
  • 好吧,我刚查了一下,班上有一条评论说“fmincg的工作方式与fminunc类似,但在处理大量参数时效率更高”。同样正如@eakbas 解释的那样,虽然fminsearch 确实用于解决非线性无约束优化,但它使用“无导数”方法(单纯形算法),这与fminunc 所做的不同(它需要函数的梯度,或者它使用有限差分计算近似值)
  • @Learnaholic:我不自称是这方面的专家,但根据Wikipedia,Nelder–Mead 单纯形法(fminsearch 使用)可以收敛到非平稳点关于一些可以通过替代方法解决的问题。显然,该问题必须满足比其他方法所必需的更严格的条件。我真的没有动力去深入挖掘,也许你可以从这个paper中学到更多。祝你好运:)

标签: matlab octave mathematical-optimization


【解决方案1】:

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

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

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

【讨论】:

  • 问题是 fminsearch 甚至根本没有开始收敛。这种情况下的方法对这种情况无关紧要。正如 fminsearch 所期望的那样,问题是凸的。那么为什么它不起作用呢?
  • “开始收敛”是什么意思。你有没有运行它直到收敛?您是否尝试更改其参数,例如最大功能评估次数、公差?我希望 fminsearch 能够找到凸成本函数的全局最小值。至少,这是我目前的经验。
  • 我已经改变了迭代次数,最大函数评估次数,没有区别。它并没有偏离 0.692991 的数字。我还编辑了更多信息。是的,它是凸的且处处可微。
  • 所以,您运行 fminsearch 直到收敛。它会给你一个错误的结果吗?它是否返回初始点作为结果?如果改变初始点会发生什么?
  • 1) 我不知道它运行到收敛。它不会收敛到任何东西。 2) 如果初始点全为零,则返回全1.9e-4。如果我将初始点设为其他任何内容,是的,它将返回该初始点。 3) 是的,它会返回初始点作为结果。
【解决方案2】:

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

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

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

【讨论】:

  • 我想知道拉斯曼是,如果算法甚至没有从一开始就开始移动,那么公差为什么/如何重要?
  • @Learnaholic 相反,Func-count 几乎立即跃升至 400
  • @Learnaholic,顺便说一句,这让我想知道 t 的大小。该算法对巨大的输入响应不太好。
  • Rasman,我不确定我是否理解你所说的容忍度是什么意思……在我看来,只有在你开始收敛之后,容忍度才重要吗?顺便说一句,t 的大小是 400。
  • 好的,所以我的解决方案可能不好。 FTR,fminsearch 将难以收敛(尽管它仍然可能)。更改容差的目标是假设您已经深入到兔子洞,以至于导致您的问题的小反射不值得努力。但是,就您而言,您可能还有很长的路要走
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2014-08-13
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多