top of page
작성자 사진JC.kim

[Python] Machine Learning #2. Perceptron2

최종 수정일: 2018년 3월 5일



이번에는 Perceptron을 파이썬 클래스로 정의하려고 오브젝트 지향방식을 사용한다.

([Python] Machine Learning #1. Perceptron 참조)

여기서 fit Method를 이용하여 학습데이터를 초기화 시킨다음, perdict method를 이용하여 예측을 한다. Perceptron의 코드는 아래와 같다.

Python 에서 """ 표시는 각주를 나타낸다. 빨간색으로 글씨가 써져있는 부분은 모두 추가 설명이다. 맨 윗줄부터 코드를 보자.

* import numpy as np

라이브러리 numpy를 np로 로드한다 라는 뜻이다. numpy는 python이 가지고 있는 라이브러리 중 하나이다. numpy를 로드한 이유는 아래 벡터의 내적에 이용하기위해 로드 되었다.


* class Perceptron(object):

class 는 객체지향적임을 말한다. 즉 우리가 Perceptron이라는 새로운 object를 정의해 새로운 라이브러리를 생성한 것이다.


* def __init__(self, eta=0.01 , n_iter=10):

eta와 iter parameter를 정의한다. 여기서 eta와 n_iter값은 Perceptron의 초기값이다. 특별한 초기값을 주지 않는다면, eta는 0.01 iter는 10으로 작동된다. 여기서 eta와 iter number는 각주에 설명이 되어있다. eta 는 Learning rate를 나타낸다. float 실수형으로 쓰였고 수식에서는 η를 나타낸다. n_iter는 데이터를 훈련하는 횟수이다. errors_는 각 학습 마다 잘 못된 분류의 숫자를 말해준다. 이는 실제값과 예측값의 차이 이다. w_는 1차원 배열로써 fitting이후의 weight를 나타낸다. 수식에서는 Δw를 나타낸다.

def 는 파이썬에서 쓰는 문법으로 함수 선언을 할때 사용한다. class 내부의 subroutine인 Method는 오직 클래스 또는 클래스 인스턴스만 호출 할 수 있다. subroutine는 어디서든 호출가능하다. 파이썬에서는 def로 함수를 선언하고 ':' 콜론으로 끝낸다. 파이썬은 함수도 객체로 취급한다.

init 앞 뒤의 __ 의 표시는 python의 언어를 나타내며 __init__는 생성자 'Constructor' 라는 호출명이다. 말 그대로 무언가를 호출 할 때, 객체 생성시 초기화 작업을 하기위해 사용하는 호출명이다.


* self.eta = eta

* self.n_iter = n_iter

eta를 이제 self.eta 로 정의한다. self는 class의 instance이다. class를 초기화 할때 사용하는 문법이다. 이로써 eta와 iter number를 초기값으로 초기화 할 수 있다.


*def fit(self, X, y):

여기는 target 과 sample 을 정의하여 perceptron의 수식들을 코드로 구현했다. Parameter X는 training vector이다. n_sample은 sample의 갯수이며, n_features는 features의 갯수이다. y는 실측 값이다.


*self.w_ = np.zeros(1+X.shape[1])

np.zeros는 numpy에 있는 Method이다. np.zeros()은 ()안에 있는 수 만큼 비어있는 공간을 만든다. self.w_에 1+X.shape[1] 공간을 만들어 준다. self.w_의 가중치를 제로벡터로 초기화 하며, 여기에 1을 더하여 임계치를 설정했다.

*self.errors_ = []

예측값과 실제 값에 의해 발생하는 오차를 저장하는 공간을 만들어 준다. errors의 공간을 만든다.


*for _ in range(self.n_iter):

errors = 0

for xi, target in zip(X, y):

update = self.eta * (target - self.predict(xi))

self.w_[1:] += update *xi

self.w_[0] += update

errors += int(update != 0.0)

self.errors_.append(errors)

return self

위의 코드에서는 for 조건문이 작동한다. 먼저 오차값(errors)를 0으로 초기화 한 뒤 weight의 변화량(update)은 학습률(self.eta) 에 실측값(target)에서 예측값(self.predict)을 뺀 값, 즉 오차를 곱한다. 오차가 발생하여 self.w_의 공간에 값이 생기면 update값을 xi 곱하여 새로운 weight를 업데이트 한다. 오차가 발생하지 않는다면, update는 갱신되지 않는다. 그리고 update가 0이 아니면 errors가 추가된다. 이는 업데이트 된 값이 있다면 errors이 새로 갱신된다는 의미이다. 그리고 결정된 errors 가 append에 의해 리스트의 맨 마지막에 추가된다. 이후 self를 반환한다.


*def net_input(self, X):

return np.dot(X, self.w_[1:]) + self.w_[0]

여기서는 업데이트된 가중치를 X (training vector)와 내적한다. 그리고 이전 weight를 더하여 weight와 input의 내적인 z (Thresholded; 임계치) 을 완성한다. 여기서 numpy의 dot을 이용하여 계산했는데, np.dot은 단순한 산술연산을 벡터화 시키는 특징이 있다. 이렇게 되면 배열 내에 있는 모든 요소들에게 자동적으로 연산이 된다.


*def predict(self, X):

return np.where(self.net_input(X) >= 0.0 , 1, -1)

np.where은 input의 원소가 0이상이 ture값일때는 1을 반환하고, 0보다 작다면 -1을 반환시킨다. Heaviside step function을 완성한다. where method는 조건에 맞는 결과를 찾을때 사용 한다.


weight가 초기화되고나면 fit method에 의해 훈련 데이터를 전체 개별 요소에 갱신한다. 분류된 결과들은 predict에 의해(heaviside step function)에 의해 예측된다. errors는 각 회차마다 오분류수를 수집하면서 Perceptron의 기능이 얼마나 잘 작동되는지 분석한다.

조회수 392회댓글 0개

최근 게시물

전체 보기

Comments


bottom of page