FMINUNC检查梯度失败
6视图(30天)
显示旧的评论
大家好,
我试图最小化通过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内和有限差分衍生品不是。
如何得到上述结果提供梯度和为什么它不工作?
谢谢!