FMINUNC检查梯度失败

6视图(30天)
埃米利亚诺·罗索
埃米利亚诺·罗索 2022年12月19日
编辑: 埃米利亚诺·罗索 2022年12月21日
大家好,
我试图最小化通过fminunc运行这个函数:
(ygrad、成本)= tvd_sim_grad (x,林,幼虫,t);
x 4096 x1双& lam Nit t是1 x1的两倍。
函数[xden, fval] = tvd_sim_grad (y, lam幼虫,t)
rng默认的%的再现性
ycut =双(abs (y) - t > 0);%减少离群值t =方差计算使用健壮的协方差估计。
yind =找到(ycut = = 1);
y (yind) = t;
y = y + 1;%必要出去附近的零
y0 = y;
ObjectiveFunction = @ (y) tvd_sim2 (y, y0, lam);
选择= optimoptions (“fminunc”,“麦克斯特”没用的人,“ObjectiveLimit”0,“MaxFunEvals”正,“TolFun”1 e-20
“TolX”1 e-20“UseParallel”假的,“SpecifyObjectiveGradient”,真的,“CheckGradients”,真的,
“FinDiffRelStep”1平台以及“DiffMinChange”0,“DiffMaxChange”正,“诊断”,“关闭”,“算法”,“拟牛顿”,
“HessUpdate”,“蓄热”,“FinDiffType”,“中央”,“HessianFcn”[],
“PlotFcns”,“optimplotfval”,“显示”,最后详细的);
[xden, fval] = fminunc (ObjectiveFunction y选项);
xden = xden-1;% 0调整
结束
函数(TVD mygrad] = tvd_sim2 (x, y, lam)
TVD = 1/2。*总和(abs ((x) ^ 2)) + lam。*总和(abs (diff (diff (y / (1 - x * x ^ 2)))));
f = @ (x) 1/2。*总和(abs ((x) ^ 2)) + lam。*总和(abs (diff (diff (y / (1 - x * x ^ 2)))));
mygrad =梯度(f (x)); mygrad = mygrad ';
结束
这是我创建的一个修改的总变分去噪函数本身的可诱导的(原来不是可微的第二项)。这个函数可微的真实空间除了0。正如你所看到的我的修改数据集避免零和现在数据压缩值1。
当我使用:
“SpecifyObjectiveGradient”,错误的
我获得这个伟大的结果(红线xden):
但是当我使用:
“SpecifyObjectiveGradient”,真正的
它使0迭代和失败返回:
优化停止因为目标函数不能减少
当前的搜索方向。预测目标函数的变化,
或线搜索间隔小于每股收益。
“CheckGradients”,真正的
给我:
目标函数导数:
提供最大相对区别
和有限差分衍生品= 33382.1。
提供导数元素(1012 1):0.480282
有限差分微分元素(1012 1):-33381.7
CheckGradients失败了。
____________________________________________________________
错误使用validateFirstDerivatives(第102行)
CheckGradients失败:
提供1 e-06内和有限差分衍生品不是。
如何得到上述结果提供梯度和为什么它不工作?
谢谢!
13个评论
埃米利亚诺·罗索
埃米利亚诺·罗索 2022年12月21日
编辑:埃米利亚诺·罗索 2022年12月21日
谢谢,我节省5秒!
我发现我可以使用:
TVD = 1/2。*总和((x) ^ 2) + lam。*总和((diff (diff (y / (1 - x * x ^ 2)))) ^ 2);
而不是使用abs,它的运作是一样的……我认为现在是可诱导的,我可以提取解析函数!
在任何情况下现在我所做的是提供有限差分计算时间是相同的,事实上,我需要几秒钟时间但我感到惊讶。没有一个解析函数我不能分解。
或者我想优化梯度计算代码,通常matlab做不到因为它收到许多不同的功能。

登录置评。

答案(0)

s manbetx 845


释放

R2020b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的