6-13 주기적인 Sin함수의 RNN(Recurrent Neural Network) 학습과 예측

codingart(66)
Published in
#kr
Words
269
Reading
2 min
Listen
Play
7y

noname01.png

RNN 머신 러닝 학습코드는 랜덤한 증권 가격을 학습 후 학습 기간 이 후의 구간에서도 랜덤한 예측 값을 잘 보여 주었다. 그와 반대로 RNN을 사용하여 랜덤이 아닌 주기적으로 변동되는 Sin 함수 그래프를 예측해 보자.

Sin 함수 예측 문제를 풀어보기 위해서는 엑셀 데이터 csv 파일 준비가 필요하다. 첫 번째 컬럼에서 0.0∼10,0 사이의 구간을 1000 등분한다. 엑셀에서 일정한 값 만큼 증가되는 값을 준비하려면 첫 번째 와 두 번째 cell에 값을 쓴 후 이 두cell 을 활성화 하여 아래로 1000번 cell까지 내리면 된다. 이 값에 대한 sin(6x)의 값을 두 번째 컬럼에 준비한다. 그 요령을 두 번째 cell에 ‘=sin(6*A1)’ 과 같이 코딩 후 이 cell을 활성화 시켜 1000번째 cell 까지 내리면 된다.

RNN 코드는 증권예측 코드와 동일하나 아래와 같이 파라메터들을 바꿔 주어야 한다. 증권가격 예측에서는 data_dim = 5 였지만 이 문제에서는 x 좌표와 Sin 함수 값 2개이 컬럼 데이터가 필요하므로 data_dim = 2 로 설정한다. 각 컬럼별 데이터 포인트 수는 알기 쉽게 1000개로 하였다.

noname02.png

train_size를 결정함에 있어서 10% 범위를 설정한다. Sin 함수는 주기 함수이기 때문에 현재 위 그래프에 의하면 9개 반 의 주기를 포함하고 있는데 대략 1개 주기를 대상으로 학습하고 웨이트 값을 결정하게 된다.

결과적으로 나머지 8개 반의 Sin 함수의 주기적인 거동을 얼마나 비슷하게 예측하는냐는 다소 아날로그적인 감이 드는 문제이다. 즉 관찰 포인트는 주기와 진폭 에러로 두자. sequence_length 값이 커짐에 따라 오차가 많이 줄어들며 주기 자체는 정확하게 예측 한다는 것을 알 수 있다. 스펙트럼 차원에서 보면 주파수가 일정하다는 점을 RNN 이 파악하고 있다는 것이 될 것이다.
noname03.png

이 예제를 돌려 보기 위한 코드는 필자의 외부 블로그인 아래 url 주소에서 다운받아 사용하기 바란다. 단 엑셀 데이터 파일과 파이선 코드를 같은 폴더에 두도록 한다. 아울러 파이선 토드 다운 로드 시에 indentation 훼손 여부를 반드시 확인해 보기 바란다.

http://blog.daum.net/ejleep1/761

마나마인로고.png

6-13 주기적인 Sin함수의 RNN(Recurrent Neural Network) 학습과 예측 | Ecency