728x90
반응형
선형 회귀를 위한 뉴런
경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스
1. __init__() 메서드 작성 - 초기화
class Neuron :
def __init__(self): # 초기화 작업
self.w = 1.0
self.b = 1.0
2. 정방향 계산 만들기
뉴런을 도식화한 상태에서 y했을 구하는 방향을 보고 만든 용어
y햇 = w * x + b
def forpass(self, w):
y_hat = x * self.w + self.b
return y_hat
3. 역방향 계산 만들기
(-(y-y햇))
정방향 계산을 통해 얻어낸 y햇과 y의 차이, 오차가 뉴런의 오른쪽 방향에서 왼쪽 방향으로 흐르는 것처럼 보임
def backprop(self, w, err):
w_grad = x * err # 가중치에 대한 기울기를 계산
b_grad = 1 * err # 절편에 대한 기울기 계산
return w_grad, b_grad
편미분 수식, 가중치 기울기는 x와 오차(err)를 곱하고 절편의 기울기는 1과 오차(err)를 곱하면 된다.
이후 이 값들로 가중치와 절편을 업데이트해 점차 훈련 데이터에 최적화된(손실 함수가 가장 작은 값인) 가중치와 절편을 얻을 수 있다.
4. Neuron 클래스
# 선형 회귀를 위한 뉴런
# 경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스
class Neuron :
def __init__(self): # 초기화 작업
self.w = 1.0
self.b = 1.0
def forpass(self, x):
y_hat = x * self.w + self.b
return y_hat
def backprop(self, x, err):
w_grad = x * err # 가중치에 대한 기울기를 계산
b_grad = 1 * err # 절편에 대한 기울기 계산
return w_grad, b_grad
경사 하강법 알고리즘 핵심
5. 훈련을 위한 fit() 메서드 구현
def fit(self, x, y, epochs=100):
for i in range(epochs): 에포크만큼 반복
for x_i, y_i in zip(x, y): # 모든 샘플에 대해 반복
y_hat = self.forpass(x_i) # 정방향 계산
err = -(y_i - y_hat) # 오차 계산
w_grad, b_grad = self.backprop(x_i, err) # 역방향 계산
self.w -= w_grad # 가중치 업데이트
self.b -= b_grad # 절편 업데이트
6. 모델 훈련하기 (학습)
neuron = Neuron()
neuron.fit(x, y)
7. 학습 완료 모델의 가중치 절편 확인
학습이 완료된 가중치와 절편은 neuron.w와 neuron.b에 저장되어 있다.
그래프 그리기
# 선형 회귀를 위한 뉴런
# 경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스
class Neuron :
def __init__(self): # 초기화 작업
self.w = 1.0
self.b = 1.0
def forpass(self, x):
y_hat = x * self.w + self.b
return y_hat
def backprop(self, x, err):
w_grad = x * err # 가중치에 대한 기울기를 계산
b_grad = 1 * err # 절편에 대한 기울기 계산
return w_grad, b_grad
def fit(self, x, y, epochs=100):
for i in range(epochs): #에포크만큼 반복
for x_i, y_i in zip(x, y): # 모든 샘플에 대해 반복
y_hat = self.forpass(x_i) # 정방향 계산
err = -(y_i - y_hat) # 오차 계산
w_grad, b_grad = self.backprop(x_i, err) # 역방향 계산
self.w -= w_grad # 가중치 업데이트
self.b -= b_grad # 절편 업데이트
neuron = Neuron()
neuron.fit(x, y)
plt.scatter(x, y)
pt1 = (-0.1, -0.1 * neuron.w + neuron.b)
pt2 = (0.15, 0.15 * neuron.w + neuron.b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()
728x90
반응형
최근댓글