로지스틱 회귀 뉴런 만들기
우선 __init__(), forpass(), backprop()은 앞서 만든 뉴런과 별로 다르지 않다.
class LogisticNeuron:
def __int__(self):
self.w = None
self.b = None
def forpass(self, x):
z = np.sum(x * self.x) + self.b
return z
def backprop(self, x, err):
w_grad = x * err
b_grad = 1 * err
return w_grad, b_grad
forpass에서 np.sum은 numpy모듈에서 sum이라는 메서드를 이용하여 가중치와 입력의 곱을 더하는 것이다.
훈련
활성화 함수라는 것이 추가되었기 때문에 fit()함수를 조정해야 한다.
def fit(self, x, y, epochs=100):
self.w = np.ones(x.shape[1]) #가중치 초기화
self.b = 0 #절편 초기화
for i in range(epochs):
for x_i, y_i in zip(x, y):
z = self.forpass(x, y) #정방향 계산
a = self.activation(z) #활성화 함수
err = -(y_i - a) #오차 계산
w_grad, b_grad = self.backprop(x_i, err) #역방향 계산
self.w -= w_grad #가중치 업데이트
self.b -= b_grad #절편 업데이트
activation( ) 메서드에는 시그모이드 함수가 사용된다.
코드는 다음과 같다.
def activation(self, z):
a = 1 / (1 + np.exp(-z)) #시그모이드 계산
return a
예측
훈련이 된 모델이 예측하여 결과를 내는 함수를 만들어 보자.
2차원 데이터를 전달받아 1차원으로 결과를 내야하기 때문에 선형으로 바꿔주는 작업이 필요하다.
def predict(self, x):
z = [self.forpass(x_i) for x_i in x] #결과를 선형으로
a = self.activation(np.array(z)) #활성화 함수 적용
return a > 0.5 #계단 함수 적용
a값이 0.5를 넘으면 1로 판단하게 구현했다.
코드를 총 종합해 보면 다음과 같다.
class LogisticNeuron:
def __init__(self):
self.w = None
self.b = None
def forpass(self, x): #직선 방정식 계산
z = np.sum(x * self.w) + self.b
return z
def backprop(self, x, err): #역방향 계산
w_grad = x * err
b_grad = 1 * err
return w_grad, b_grad
def activation(self, z): #활성화 함수 적용
a = 1 / (1 + np.exp(-z))
return a
def fit(self, x, y, epochs=100):
self.w = np.ones(x.shpae[1]) #가중치 초기화
self.b = 0 #절편 초기화
for i in range(epochs):
for x_i, y_i in zip(x, y):
z = self.forpass(x_i) #정방향 계산
a = self.activation(z) #활성화 함수
err = -(y_i - a) #오차 계산
w_grad, b_grad = self.backprop(x_i, err) #역방향 계산
self.w -= w_grad #가중치 업데이트
self.b -= b_grad #절편 업데이트
def predict(self, x): #예측
z = [ self.forpass(x_i) for x_i in x ]
a = self.activation(np.array(z))
return a > 0.5