У меня вопрос с классическим алгоритмом спуска градиента. В последнее время я хочу реализовать программу подгонки функций при условии, что будут отмечены наблюдаемые данные, а также параметры функции. Метод, который я использовал, - это алгоритм спуска градиента, поскольку производные функции доступны. Предположим, что функция параметры заданы, можно создать имитацию данных на основе функции:Почему решение идет в нужном направлении все время с помощью алгоритма спуска градиента?
clean;
rng('default');
rng(54321);
low_value = 15;
high_value = 200;
dis_value = (high_value-low_value)/2;
central_value = (low_value+high_value)/2;
x = 1:55;
central_pixel = (1+length(x))/2;
delta = 3;
len = length(x);
y_true = dis_value*erf((x-central_pixel)./delta)+central_value;
y = y_true + randn(1,len);
figure;plot(x,y,'b*');
hold on; plot(x,y_true,'r');
На рисунке ниже показаны смоделированные данные (точки размытость звездочки), а также потенциальной функции (красным цветом): Как видно из рисунка есть два параметра оценить в этом примере, одна позиция центральной точки р, а другой является стандартным вывод дельта, а функция записывается в виде
, где A и B можно считать известным. Тогда, если я хочу использовать алгоритм спуска градиента, я должен сделать две вещи: один определяет производные функции для двух неизвестных параметров (p и delta) соответственно, а другой - для вызова алгоритма спуска градиента. Тем не менее, то, что я нашел в заблуждение в том, что в ходе итерационной процедуры один из оцениваемых параметров (дельта) не идет в правильном направлении все время:
я могу сделать, однако, отметить, что функция объекта (сумма квадрата расстояния между фитингом точки и расчетной функции) всегда становится меньше:
Мой вопрос тогда почему решения не всегда идут в правильном направлении, хотя в конце концов они могут достичь в нужном месте. Благодаря!