59doit

선형회귀 뉴런 본문

인공지능

선형회귀 뉴런

yul_S2 2023. 1. 5. 13:25
반응형

선형 회귀를 위한 뉴런  (파이썬클래스)

# 1. 뉴런 클래스 만들기

class Neuron :
    def __init__(self):
    # 초기화 작업 수행
    ...
    # 필요한 메서드 추가
    ...

▶ 우선, 생성자에서 필요한 변수를 선언하고 초기화한다.

 

 

# 2. 생성자 ( __init__()매서드 작성)

def __init__(self) :
    self.w = 1.0
    
self.b = 1.0
 

 가중치 w, 절편 b 임의 지정

여기서 1.0은 임의로 선정한 수이다. 다른 수여도 아무런 문제가 없다.

 

 

# 3. 정방향 계산 만들기 _ (예측값을 계산하는 과정 = 기울기와 절편을 예측)

def forpass(self, x) :
    y_hat = x * self.w + self.b        # 직선방정식 = 1차방정식
    return y_hat

▶ y_hat 을 만드는 방향 : 정방향
메서드 이름 : forpass 로 정하기
가중치와 절편은 인스턴스 변수 w와 b에 저장되어 있는 값을 사용

 

 

 

# 4. 역방향 계산 만들기 _ (오차율을 가지고 기울기와 절편을 업데이트)

def backpro(self, x, err) :
    w_grad = x*err # 가중치에 대한 그레이디언트 계산
    b_grad = 1*err # 절편에 대한 그레이디언트 계산

▶ err = y_hat - y 

grad란? > 미분 값
오차 = 역방향, 역전파
메서드 이름 : backprop 로 정하기

 

 

# 5. 훈련

class Neuron :
    def __init__(self) :
        self.w = 1.0
        self.b = 10.
    def forpass(self, x) :
        y_hat = x * self.w + self.b
        return y_hat
    def backprop(self, x, err) :
        w_grad = w*err
        b_grad = 1*err
        return ("w_grad :", w_grad, ",", "b_grad :", b_grad)

 

 

 

# 6. fit() 메서드 구현 _ (훈련 데이터를 통해 가중치와 절편을 업데이트)

def fit(self, x, y, lr = 10, epochs = 100) :
    for i in range(epochs) :           # epochs만큼 반복
        for x_i, y_i in zip(x,y) :     # 모든 샘플에 대해 반복
            y_hat = self.forpass(x_i)  # 정방향계산
            # err = -(y_i - y_hat)      # 오차 계산
            err2 = -(2 / n) * (y_i - y_hat)
            w_grad, b_grad = self.backprop(x_i, err)   # 역방향 계산
            self.w -= w_grad * lr           # 가중치 업데이트 : 그레디언트를 가중치에서 뺀다.
            self.b -= b_grad * lr          # 절편 업데이트 :: 그레디언트를 절편에서 뺀다.

forpass 메서드를 호출하여 y_hat을 구한다.
오차를 계산한다
backprop 메서드를 호출하여 가중치와 절편에 대한 그레디언트를 구한다

그레디언트를 가중치와 절편에서 뺀다

100번 반복한다 : "epochs = 100"

learning rate : 학습률을 지정해준다 -> lr = 10 으로 지정하였음

 

 

# 6. 최종코드

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 backprop2(self, x, err2):
        w_grad = x * err2    # 가중치에 대한 그래디언트를 계산합니다
        b_grad = 1 * err2    # 절편에 대한 그래디언트를 계산합니다
        return w_grad, b_grad
 
 
    def fit(self, x, y, lr = 10, epochs=100):
        for i in range(epochs):           # 에포크만큼 반복합니다
            for x_i, y_i in zip(x, y):    # 모든 샘플에 대해 반복합니다
                n = len(x)
                y_hat = self.forpass(x_i) # 정방향 계산
                # err = -(y_i - y_hat)      # 오차 계산
                err2 = -(2/n) *(y_i - y_hat)
                w_grad, b_grad = self.backprop2(x_i, err2)
                self.w -= w_grad *lr          # 가중치 업데이트
                self.b -= b_grad *lr          # 절편 업데이트
 
neuron = Neuron()
neuron.fit(x, y, lr=10)
 
print(neuron.w, neuron.b)
# 912.802704870356 141.5126321661899

 

 

 

# 7. 시각화 ; 모델이 전체 데이터 세트를 잘 표현하는지 그래프로 알아보기

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          # 다음에 그려지는 plot  덮어져서 그려짐

▶산점도 위에 neuron.w와 neuron.b를 사용한 직선을 그려본다.

직선그래프는 시작점과 졸요점의 x좌표와 y좌표를 plot 함수에 전달한다.

x좌표 2개(-0.1,0.15) 지정

 

 

반응형

'인공지능' 카테고리의 다른 글

로지스틱 손실함수  (1) 2023.01.06
로지스틱회귀  (4) 2023.01.06
손실함수와 경사하강법의 관계  (1) 2023.01.05
경사하강법  (5) 2023.01.05
선형회귀  (1) 2023.01.05
Comments