2013-03-08 6 views
1

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

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'); 

На рисунке ниже показаны смоделированные данные (точки размытость звездочки), а также потенциальной функции (красным цветом): enter image description here Как видно из рисунка есть два параметра оценить в этом примере, одна позиция центральной точки р, а другой является стандартным вывод дельта, а функция записывается в виде

enter image description here

, где A и B можно считать известным. Тогда, если я хочу использовать алгоритм спуска градиента, я должен сделать две вещи: один определяет производные функции для двух неизвестных параметров (p и delta) соответственно, а другой - для вызова алгоритма спуска градиента. Тем не менее, то, что я нашел в заблуждение в том, что в ходе итерационной процедуры один из оцениваемых параметров (дельта) не идет в правильном направлении все время:

enter image description here

я могу сделать, однако, отметить, что функция объекта (сумма квадрата расстояния между фитингом точки и расчетной функции) всегда становится меньше: enter image description here

Мой вопрос тогда почему решения не всегда идут в правильном направлении, хотя в конце концов они могут достичь в нужном месте. Благодаря!

ответ

2

Минимизатор спуска градиента просто следует за отрицательным градиентом функции в ее текущем местоположении. Вы (вероятно) дали минимизатору, начиная с (p,delta) значений, в которых отрицательный градиент увеличивал дельта. Для разных начальных значений вы, вероятно, увидите другое поведение.

Один мысль, все же. Поскольку erfc((x-p)/delta) имеет отношение p/delta, ваши параметры несколько взаимозависимы. То есть при малых значениях x или больших значениях p/delta отношение будет доминировать, а минимизаторы могут застревать в цикле, постоянно увеличивая величину числителя и знаменателя.

Попробуйте использовать измененные параметры: erfc(x/delta - pdratio), а также установить на delta и pdratio. Затем вы можете вернуть исходный параметр p: p = pdratio*delta.

Смежные вопросы