MATLABs&x27;fminsearch';不同于倍频程';s';fmincg';

MATLABs&x27;fminsearch';不同于倍频程';s';fmincg';,matlab,octave,mathematical-optimization,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 (objFun

我试图得到一个简单优化问题的一致答案,在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和θ是在前面定义的,并且是正确的)。问题如下:当我使用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 
增加迭代次数对jack没有好处。相反,当使用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。
谢谢

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

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


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

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

除非我看到你们的数据,否则我不能多加评论,但这就是我的建议


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

问题是fminsearch甚至从未开始收敛。本例中的方法对于本例不重要。正如fminsearch所预期的那样,问题是凸的。那么为什么它不起作用呢?你说的“开始收敛”是什么意思。你把它运行到收敛吗?您是否尝试更改其参数,如最大功能评估数、公差?我希望fminsearch能够找到凸成本函数的全局极小值。至少,这是我到目前为止的经验。我已经改变了迭代次数,最大函数求值次数,并且没有任何区别。这一数字与0.692991的数字没有变化。我还编辑了一些更多的信息。是的,它是凸的,处处可微的。所以,你们运行fminsearch直到收敛。这会给你一个错误的结果吗?它是否返回初始点作为结果?如果你改变初始点会发生什么?1)我不知道它是否会收敛。它没有收敛到任何东西。2) 如果起始点全部为零,则返回所有1.9e-4。如果我把初始点换成其他任何东西,是的,它会返回初始点。3) 是的,它将返回初始点作为结果。如果我没有弄错的话,这与斯坦福大学的在线ML课程有关。如果我没记错的话,
fmincg
不是MATLAB附带的函数,而是作为家庭作业的一部分提供的。因此,您不能期望它们实现完全相同的算法。检查此项以了解FMINSEARCH算法。至于它的价值,
FMINSEARCH
是在@Amro Yes中实现的,它是从类中实现的。我不希望它们是一样的——但是主要的问题是fminsearch根本不起作用,我正在试图找出原因。这个问题是凸的,到处都是可微的,所以我不知道为什么它根本不起作用……我想做的是不必使用/依赖Octave的函数,并且使用我的原生MATLAB函数,比如fminsearch。好吧,我只是查了一下,在课堂上有一条评论说“fmincg的工作原理与fminunc类似,但在处理大量参数时效率更高”。正如@eakbas所解释的,虽然
fminsearch
确实用于解决非线性无约束优化,但它使用了一种与
fminunc
不同的“无导数”方法(单纯形算法)(它需要函数的梯度,或者使用有限差分计算近似值)@Learnaholic:我并不声称自己是这方面的专家,但根据Nelder–Mead单纯形法(由
fminsearch
使用)在一些问题上可以收敛到非平稳点,这些问题可以用其他方法解决。显然,这个问题必须满足比其他方法更严格的条件。我并没有真正的动机去深入挖掘,也许你可以从中学到更多。。祝你好运:)我想知道Rasman的是,如果算法还没有开始运行,那么公差为什么/如何重要?@Learnaholic相反,Func计数几乎跳到了400immediately@Learnaholic,顺便说一句,这让我想知道t的大小。算法对巨大的输入响应不太好。拉斯曼,我不是苏尔我仍然理解你关于公差的意思…在我看来,公差只有在你开始收敛后才重要吗?顺便说一句,t的大小是400。好的,所以我的解决方案可能是n