아래 포스팅에 가우스-뉴턴 방법을 사용하여 원의 방정식의 파라미터들을 찾는 실험을 수행한 적이 있었습니다.
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
'programming language > MATLAB' 카테고리의 다른 글
MATLAB 그래프 내에 그래프 넣기 (0) | 2019.04.13 |
---|---|
MATLAB 스트럭처 정렬 방법 (0) | 2019.03.27 |
MATLAB 브러시, 데이터 커서 기능을 사용하여 데이터 가공하기 (0) | 2019.03.04 |
MATLAB 필터 pass band 게인 normalization 방법 (0) | 2019.02.01 |
병렬 저항 계산 MATLAB 코드 (0) | 2019.01.06 |
MATLAB 을 사용하여 원의 방정식에 대해 가우스-뉴턴 방법 적용 실험 (0) | 2019.01.03 |
MATLAB si-prefix string 표현 (0) | 2018.12.29 |
Simulink shift register generation function (0) | 2018.12.23 |
댓글