Lsqnonlin неверное значение f (x) - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно решить обратную задачу, и я использую lsqnonlin для оптимизации своих параметров.В некоторых случаях lsqnonlin работает некорректно.Чтобы продемонстрировать проблему, у меня есть два варианта простого кода.Первый работает хорошо, второй не работает вообще.

  1. В первом варианте я оптимизирую 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;

  2. Во втором варианте я добавляю небольшую ошибку к функции потерь (как у меня в моем реальном эксперименте), а 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;

Что я делаю не так?Проблема, с которой я столкнулся в моем реальном эксперименте, заключается в том, что f (x) из lsqnonlin не совпадает с реальным выводом loss_func.

1 Ответ

0 голосов
/ 03 октября 2018

Ввод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...