2017. 4. 12. 21:00ㆍmachine learning
지난 포스팅에서 Polynomial Model에 대해 언급했던 것을 기억해 보자. 이번에는 다항의 모델에 sigmoid를 씌우는 형태의 다항 Logistic Regression을 구현해 볼 것이다.
아래의 데이터 분포가 주어졌을 때 Logistic Regression을 이용해서 분류를 해보자.
train data가 2차원이기 때문에 x1_label1은 group 1의 x좌표 리스트(평균 3, 표준편차 1의 1000개 리스트), x2_label1은 group1의 y좌표 리스트(평균 2, 표준편차 1의 1000개 리스트), x1_label2는 group2의 x좌표 리스트, x2_label2는 group2의 t좌표 리스트가 된다.
해당 train data가 만들어지면 x좌표는 x좌표끼리 묶어서 x1s에 저장하고, y좌표는 y좌표끼리 묶어서 x2s에 저장한다.
0과 1로 구성된 2000개 숫자 리스트를 가진 label을 만들어서 ys에 저장한다.
참고로 np.asarray 함수는 np.array 함수와 마찬가지로 배열을 만드는 함수인데, np.array와는 약간의 차이를 가지고 있다.
np.array는 기존 배열의 복사본을 만든다면, np.asarray는 기존 배열의 참조본을 만든다. 그래서 np.array 함수로 만들어진 배열 데이터는 원본 배열이 변경되더라도 변하지 않지만 np.asarray는 원본 데이터가 변경되면 해당 참조본 데이터도 같이 변하게 된다.
y_model은 기존 다항 방정식()에 sigmoid를 취한 형태를 정의한다.
cost함수는 cross-entropy로 정의하고 기존과 동일하게 session을 실행시킨다.
마지막으로 최종적으로 구해진 w_val 값들을 이용해서 boundary를 찾아낼 것이다.
0 ~ 10 사이의 x,y 좌표 범위 내에서 for문을 돌려 계산된 w_val 값과 0 ~ 10 사이의 x , y 값들을 각각 곱해서 더한 후, sigmoid를 취한 결과 값이 0.5랑 비슷하다면(0.5랑 차이의 절대값이 0.01인 경우) boundary로 간주하는 것이다.
아래 그림은 위의 데이터 분포에서 boundary를 선분으로 표현한 그림을 나타낸다.