Локальный минимум в начальной точке при подгонке гаусса с помощью `lsqcurvefit`

Я пишу код MATLAB с намерением сделать некоторые настройки. Я смоделировал график с помощью гауссова второго порядка (см. мой код ниже) и попытался подобрать его с помощью функции lsqcurvefit. К сожалению, MATLAB возвращает те же значения предположений, что и «оптимизированные» параметры, и, по-видимому, застревает в локальном минимуме.

Может кто-нибудь дать совет, что здесь может быть не так? Я знаю, что если догадка далека от «истинных» значений, это может произойти, но я ожидал, что MATLAB вернет ответ, который будет ближе к истинному значению. Улучшение начального предположения до [29,0] (что намного ближе к фактическому значению) приводит к тому же результату: начальное значение является локальным минимумом.

%%%%%%%%%%

function z= testfunction(x, xdata);

sigma=x(1)/(2*sqrt(2*log(2)));

z=((xdata.^2-2*x(2)*xdata-sigma.^2+x(2)^2)./(sigma^5*sqrt(2*pi))).*exp(-(xdata-x(2)).^2/(2.*sigma.^2));

end
%%%%%%%%


% Simulate Data

xdata= -50:1:50;

ydata = testfunction([30,0],xdata);

% Fit Data 

xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata );

xfit(1)
xfit(2)

yfit=testfunction([xfit(1),xfit(2)],xdata);

% Plot Data;
plot(xdata,yfit);
hold on;
plot(xdata,ydata,'o')

Выход:

Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point 
is less than the default value of the optimality tolerance.

<stopping criteria details>


ans =

    19


ans =

    -4

person user3673737    schedule 28.08.2017    source источник
comment
У вас есть доступ к набору инструментов Curve Fitting Toolbox? функция подгонки с опцией 'gauss2' может быть проще использовать.   -  person Cecilia    schedule 28.08.2017
comment
Спасибо за ваш ответ. Да, он у меня есть, но я хочу подогнать его таким образом, чтобы сделать его общим кодом для будущего использования. В настоящее время мне интересно узнать, в чем может быть проблема. Это связано с решателем или, возможно, функция lsqcurvefit не лучше всего использовать в этом случае?   -  person user3673737    schedule 28.08.2017


Ответы (1)


Краткий ответ: проверьте подробности критериев остановки и соответствующим образом измените критерии остановки:

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

В чем проблема?

lsqcurvefit является числовым решателем и поэтому использует критерии остановки, чтобы определить, достаточно ли достигнут локальный минимум. В общем, вы никогда не достигнете точного решения. Таким образом, решение вашей проблемы состоит в том, чтобы изменить критерии остановки, чтобы запросить более точное решение.

Как это решить?

Нажав сведения о критериях остановки, вы получите следующее объяснение:

Оптимизация завершена: конечная точка является начальной точкой. Мера оптимальности первого порядка, 7.254593e-07, меньше, чем options.OptimalityTolerance = 1.000000e-06.

Optimization Metric                                       Options 
relative first-order optimality =   7.25e-07  OptimalityTolerance =   1e-06 (default)

Итак, вы должны уменьшить OptimalityTolerance (например, до 1e-16):

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

введите здесь описание изображения

Изображение выше визуализирует новый результат, который лучше предыдущего, но еще не очень хорош. Еще раз проверив критерии остановки, вы увидите, что вам также необходимо изменить FunctionTolerance:

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);

введите здесь описание изображения

Почему параметры по умолчанию так плохи?

Обратите внимание, что вам нужно настроить критерии остановки, потому что ваша функция возвращает относительно небольшие значения. Умножение z на коэффициент 1000 без указания какого-либо параметра также даст хороший результат:

введите здесь описание изображения

person m7913d    schedule 28.08.2017
comment
Большое тебе спасибо. Я не знал, что можно легко изменить настройки оптимизации. Теперь у меня есть хорошая идея, на что обратить внимание в будущем, если я застряну с такими подгонками. Спасибо еще раз! - person user3673737; 28.08.2017