如何解决Octave 中输出属性的正确使用是什么?
我不确定使用 fminunc
时输出的用途是什么。
>>options = optimset('Gradobj','on','MaxIter','1');
>>initialTheta=zeros(2,1);
>>[optTheta,functionVal,exitFlag,output,grad,hessian]=
fminunc(@CostFunc,initialTheta,options);
>> output
output =
scalar structure containing the fields:
iterations = 11
successful = 10
funcCount = 21
即使我使用了 iteration = 1
的最大数量,它仍然没有给出 iteration = 11
的数量??
谁能解释一下为什么会这样?
也帮我处理 grad
和 hessian
属性,意味着使用它们。
解决方法
鉴于我们没有完整的代码,我认为您要准确了解正在发生的事情的最简单方法就是在 fminunc.m
本身中设置一个断点,并遵循代码的逻辑。这是使用 Octave 的好处之一,因为提供了源代码,您可以自由检查(实际上,octave 源代码中通常有有用的信息,例如引用他们依赖于实现的论文等) ).
快速看一下,似乎 fminunc
并不期望 maxiter
为 1。看看第 211 行:
211 while (niter < maxiter && nfev < maxfev && ! info)
由于 niter
在之前(在第 176
行)初始化,值为 1
,理论上如果您的 maxiter
为 1,则永远不会进入此循环,这违背了优化的全部意义。
那里还发生了其他有趣的事情,例如从第 272 行开始的内部 while 循环:
272 while (! suc && niter <= maxiter && nfev < maxfev && ! info)
这里使用“快捷方式评估”,首先检查上一次迭代是否“不成功”,然后再检查迭代次数是否小于“maxiter”。
换言之,如果前一次迭代成功,则您根本无法运行内部循环,也永远无法递增 niter
。
根据以下(非连续)行,将迭代标记为“成功”的似乎是由“实际减少与预测减少”的比率定义的:
286 actred = (fval - fval1) / (abs (fval1) + abs (fval));
...
295 prered = -t/(abs (fval) + abs (fval + t));
296 ratio = actred / prered;
...
321 if (ratio >= 1e-4)
322 ## Successful iteration.
...
326 nsuciter += 1;
...
328 endif
329
330 niter += 1;
换句话说,fminunc 似乎会尊重您的 maxiters,而忽略这些是“成功”还是“不成功”,除了它不喜欢在“成功”转弯时“结束”算法(因为在检查 maxiters 条件之前,需要先满足成功条件)。
显然这是一个学术观点,因为当您一开始甚至无法通过外循环时,您甚至不应该进入该内循环。
如果不知道您的具体代码,我无法确切地知道发生了什么,但是如果您在 fminunc 处使用断点运行代码,您应该能够轻松理解。该实现背后的数学计算可能很复杂,但代码本身似乎相当简单明了,足以遵循。
祝你好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。