2016년 4월 8일 금요일

neuroph java ANN library

ANN을 이용해서 로또 예측 함수를 찾아보려고 한다.

neuroph 라는 자바 라이브러리를 사용한다.

일단 전반적인 개념 파악을 위해

가장 심플한 Perceptron 을 사용해본다.

Perceptron이란 2-레이어 뉴럴 네트워크이다.

이진 분류에 대한 supervised learning 알고리즘이다.

들어온 입력이 정해진 두 카테고리 중 어디에 속하는지를 맞추는 문제에 해당한다.

그리고, multilayer perceptrons이란 히든 레이어가 존재하는 것이고, 

이런 녀석은 backpropagation이라는 보다 복잡한 알고리즘이 사용되어야 한다. 



Perceptron은 input layer에 여러개의 뉴론을 두고, output으로 하나 혹은 여러개의 뉴론을 둔다.

모든 뉴론은 step transfer function을 사용하고,

네트워크는 LMS 기반 러닝 알고리즘 ( Perceptron Learning 혹은 Delta Rule)을 사용할 수 있다.

각 뉴론은 하나 혹은 그 이상의 입력을 받는다.

그리고 그들을 다 더하여 출력을 만든다.

일반적으로 각 노드의 합은 weight가 붙고,

그리고 그 합이 non-linear 함수(activation function 혹은 transfer function)에 넘겨진다.

예를 들어서, 하나의 뉴론에 m+1개의 인풋이 들어오고 있고,

각각의 값을 x0~xm 이라고 하자.

그리고 각각의 값들에 대한 weight이 w0~wm 이다.

그럼 이 뉴론의 출력물은 transferfunction (x0*w0 + x1*w1 + ... xm * wm) 이 된다.



Perceptron을 사용하는 가장 대표적인 예가 

trainingSet.addRow (new DataSetRow (new double[]{0, 0}, new double[]{0}));
trainingSet.addRow (new DataSetRow (new double[]{0, 1}, new double[]{1}));
trainingSet.addRow (new DataSetRow (new double[]{1, 0}, new double[]{1}));
trainingSet.addRow (new DataSetRow (new double[]{1, 1}, new double[]{1}));

이진 연산이다. 

우리는 트레이닝 셋을 다음과 같이 구성할 것이다.

new DataSetRow (new double[]{로또회차, 로또당첨번호6개}, new double[]{1}));

이렇게 구성한 네트워크에

 new double[] { 이번회차, 예상 번호 6개} 를 넣으면 그게 맞는 번호인지 아닌지를 알려주는

함수가 되는 것이다.

맞는 번호를 찾기 위해서는 모든 숫자 구성을 넣어서 찾아야만 한다.

일단 위와 같이 구성해서 돌려보니 모든 숫자에 대해 1이라는 결과를 내놓는다.

output이 1밖에 training data로 안 주었기 때문이다.

그렇다면 각 로또 당첨번호의 가장 작은 숫자만 예상하는 함수를 만들어보기로 한다.

new DataSetRow (new double[]{로또회차, 로또당첨번호 제일작은수}, new double[]{1}));

이를 테면 다음과 같다.

1회차의 당첨번호 7이 제일 작은 숫자이다.
new DataSetRow (new double[]{1, 7}, new double[]{1}));
new DataSetRow (new double[]{1, 1}, new double[]{0}));
new DataSetRow (new double[]{1, 2}, new double[]{0}));
...
new DataSetRow (new double[]{1, 45}, new double[]{0}));

2회차의 당첨번호 9가 제일 작은 숫자이다.
new DataSetRow (new double[]{2, 9}, new double[]{1}));
new DataSetRow (new double[]{2, 1}, new double[]{0}));
new DataSetRow (new double[]{2, 2}, new double[]{0}));
...
new DataSetRow (new double[]{2, 45}, new double[]{0}));

그럼 training data의 크기는

45 * 697 = 31365 개가 된다.

이렇게 해서 가장 작은 수~가장 큰 수까지 6번의 수행을 하면

각각에 대한 함수를 얻을 수가 있고, 이 함수에 1~45까지 넣어보면 결과를 얻을 수 있다.

일단 이 정도만 하고 돌려보니 굉장히 시간이 많이 걸린다.

시간이 많이 걸리는 와중에 생각해보니, 위와 같이 구성을 하면 중복된 당첨번호가

나올 가능성이 제기가 되었고....

차라리 이건 어떨까.

1회차 당첨번호
10,23,29,33,37,40 인데 

new DataSetRow (new double[]{1, 10}, new double[]{1}));
new DataSetRow (new double[]{1, 23}, new double[]{1}));
new DataSetRow (new double[]{1, 29}, new double[]{1}));
new DataSetRow (new double[]{1, 33}, new double[]{1}));
new DataSetRow (new double[]{1, 37}, new double[]{1}));
new DataSetRow (new double[]{1, 40}, new double[]{1}));

그리고 나머지 숫자에 대해서는 0을 넣어준다. 

new DataSetRow (new double[]{1, 1}, new double[]{0}));
new DataSetRow (new double[]{1, 2}, new double[]{0}));

이렇게 697회를 넣어주고 {697, 1} 부터 {697, 45} 까지 값을 넣어서

체크해보면 된다.

잘 설명은 못하겠지만, 전혀 기대가 되지 않는다...제대로 된 값이 나올 가능성이 굉장히

미약해 보임....

그래도 한번 해보고 어서 로또를 사러 가자.






댓글 2개:

  1. I think making algorithm which repeats just those boring tasks will make you a little bit more comportable..

    답글삭제
    답글
    1. and I am giving you comment about 3 years later, ha.. I wonder you get the point.

      삭제