아래 포스팅에 가우스-뉴턴 방법을 사용하여 원의 방정식의 파라미터들을 찾는 실험을 수행한 적이 있었습니다.

https://iamaman.tistory.com/2759

가우스-뉴턴 방법을 적용한 결과 수렴이 되긴 하지만 초기값 설정에 따라 발산하는 경우가 너무나 많은 걸 확인 할 수 있었습니다. 그래서 이번에는 같은 문제에 대해 Gradient Descent 방법을 적용해 보았습니다. Gradient Descent 방법 적용을 위한 수식은 위 주소의 포스팅과 아래 포스팅을 참조하시기 바라고 원의 방정식에 대한 MATLAB 코드 역시 마찮가지로 위 주소의 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2760?category=422993

원의 방정식에 대해 Gradient Descent 방식을 적용하여 파라미터를 찾는 코드는 아래와 같습니다.

%% Gradient Descent

XX=X(:);

YY=Y(:);

ramda = 0.05;

x = [-20;-20;-2]; % 초기값

maxIndex = length(XX)-10;


k1=1;

while 1

nn = randi(maxIndex); % random index

Y=YY(nn:(nn+3));

X=XX(nn:(nn+3));

F = sqrt((X-x(1)).^2 + (Y-x(2)).^2)-x(3);

J = [(x(1)-X)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) (x(2)-Y)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) -ones(size(X))];

errV = J'*F;

x = x-2*ramda*J'*F;

if mean(abs(errV))<0.00002

    disp(k1)

break

end

k1=k1+1;

end

k1

x

X 의 초기값은 [-20;-20;-2] 으로 설정했고, Gradient Descent 알고리즘을 위한 step 값은 0.05 로 설정했습니다. error 의 절대값이 0.00002 이하일때 알고리즘을 멈추도록 했고 learning 횟수를 display 하도록 설정했습니다.

learning 횟수는 그때 그때 다르지만 초기값 설정에 따른 발산 정도는 Gauss-Newton 방식에 비해 확실히 덜 한것 같다는 느낌이 들었고 아래 결과와 같이 15698 회 정도 learning 이 된 후에 정상적인 X 값을 찾는 것을 확인 할 수 있었습니다.

k1 =

15698

x =

1.0000

3.0000

3.0000



+ Recent posts