我需要解决反问题,然后使用lsqnonlin优化参数。在某些情况下,lsqnonlin无法正常工作。为了演示该问题,我有两种简单的代码变体。第一个效果很好,第二个根本不起作用。
在第一个变体中,我优化了x ^ 2。
options = optimoptions('lsqnonlin','Display','iter');
param_opt = lsqnonlin(@(param)loss_func(param),0.1,-1,1,options);
function loss = loss_func(param)
loss = param.^2;
end
我得到这个结果:
Norm of First-order
Iteration Func-count f(x) step optimality
0 2 0.0001 0.0022
1 4 7.40992e-06 0.0456004 0.000299
2 6 5.09591e-07 0.0248167 3.92e-05
3 8 3.35176e-08 0.0130147 5.02e-06
param_opt = 0.0135;
在第二个变体中,我向损失函数添加了一个小错误(就像我在实际实验中一样),而lsqnonlin无法正常工作。
options = optimoptions('lsqnonlin','Display','iter');
param_opt = lsqnonlin(@(param)loss_func(param),0.1,-1,1,options);
function loss = loss_func(param)
loss = param.^2+(1e-6)*rand;
end
我得到这个结果:
Norm of First-order
Iteration Func-count f(x) step optimality
0 2 0.000100005 0.0315
1 4 0.000100005 0.00299768 0.0315
2 6 0.000100005 0.00074942 0.0315
3 8 0.000100005 0.000187355 0.0315
4 10 0.000100005 4.68387e-05 0.0315
5 12 0.000100005 1.17097e-05 0.0315
6 14 0.000100005 2.92742e-06 0.0315
7 16 0.000100005 7.31855e-07 0.0315
param_opt = 0.1000;
我在做什么错?我在实际实验中遇到的问题是lsqnonlin的f(x)与实际的loss_func输出不匹配。
答案 0 :(得分:0)
lsqnonlin的输入应为向量loss = param
,该算法将进行平方和。无论如何,我认为您最好使用fmincon:
options = optimoptions('fmincon','Display','iter');
x = fmincon(@loss_func,0.1,[],[],[],[],-1,1,[],options);
function loss = loss_func(param)
loss = param.^2;
end