微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Octave 中输出属性的正确使用是什么?

如何解决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数量??

谁能解释一下为什么会这样? 也帮我处理 gradhessian 属性,意味着使用它们。

解决方法

鉴于我们没有完整的代码,我认为您要准确了解正在发生的事情的最简单方法就是在 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 举报,一经查实,本站将立刻删除。