본문 바로가기

프로그래머스 데브 코스/TIL

[6기] 프로그래머스 인공지능 데브코스 31일차 TIL

1001

Do it! 정직하게 코딩하며 배우는 딥러닝 입문

위 도서 참고하여 코랩에서 딥러닝 실습하기

코드 간단하게만 정리 
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()   # 사이킷런에서 제공하는 당뇨병 환자 관련 데이터셋으로 실습

print(diabetes.data.shape, diabetes.target.shape)   # 데이터셋 크기 확인

diabetes.data[0:3]   # 데이터셋 확인

diabetes.target[:3]   # 데이터셋 타겟 데이터 확인

import matplotlib.pyplot as plt
plt.scatter(diabetes.data[:, 2], diabetes.target)
plt.xlabel('x')
plt.ylabel('y')
plt.show()   # 데이터셋 그래프로 시각화하기

x = diabetes.data[:, 2]
y = diabetes.target   # 선형회귀 식 구성하기 위해 x, y 선언

w = 1.0 
b = 1.0   # 가중치와 편향 초기화

y_hat = x[0] * w + b   # 선형회귀 기본 식 선언
print(y_hat)           # y_hat은 예측값을 의미

print(y[0])   # 예측값과 실제 y[0]값 비교하기

w_inc = w + 0.1   
y_hat_inc = x[0] * w_inc + b   # 가중치값 높인 예측값 만들기
print(y_hat_inc)

w_rate = (y_hat_inc - y_hat) / (w_inc - w)   # 가중치값 올렸을 때의 예측값 증가 비율
print(w_rate)

w_new = w + w_rate   # 증가율과 가중치값 더해서 새로운 가중치값 생성
print(w_new)

b_inc = b + 0.1
y_hat_inc = x[0] * w + b_inc   # 이번에는 편향값 높여서 예측값 재생성
print(y_hat_inc)

b_rate = (y_hat_inc - y_hat) / (b_inc - b)   # 편향과 예측값 증가 비율 확인
print(b_rate)

b_new = b + 1   # 편향에 1 더해서 새로운 편향 만들기
print(b_new)

err = y[0] - y_hat   # 실제 값에서 예측값 빼기
w_new = w + w_rate * err   # 그 값을 가중치 증가율과 곱한 뒤 가중치값과 더해 새로운 가중치 업데이트
b_new = b + 1 * err   # 그 값을 편향 증가율과 곱한 뒤 편향값과 더해 새로운 편향 업데이트
print(w_new, b_new)

y_hat = x[1] * w_new + b_new   # 새로운 편향, 가중치값으로 다음 값인 y[1] 예측하기
err = y[1] - y_hat   # 예측값과 실제값 빼서 오류값 확인하기
w_rate = x[1]   # 새로운 가중치 증가율로 x[1] 선언하기
w_new = w_new + w_rate * err   
b_new = b_new + 1 * err   # 이전에 수행한 코드들을 이용해 가중치 및 편향 업데이트
print(w_new, b_new)


for x_i, y_i in zip(x, y):   # 위의 코드 데이터셋에 전체 적용
  y_hat = x_i * w + b
  err = y_i - y_hat
  w_rate = x_i
  w = w + w_rate * err
  b = b + 1 * err
print(w, b)

plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)   # 위에서 만들어진 편향과 가중치값으로 직선 그래프 그리기
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()   # 위의 당뇨병 환자 그래프 위에 그려짐

for i in range(1, 100):   # 모든 데이터셋에 적용하는 코드를 100 번 반복하여 학습
  for x_i, y_i in zip(x, y):
    y_hat = x_i * w + b
    err = y_i - y_hat
    w_rate = x_i
    w = w + w_rate * err
    b = b + 1 * err
print(w, b)

plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)   # 그리고 다시 그래프를 만들어 보면 이전보다 예측이 더 잘된 모습을 볼 수 있음
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

x_new = 0.18   # 만약 새로운 x값이 들어왔을 때
y_pred = x_new * w + b   # 우리가 만든 식을 이용해서 y 예측해 보기
print(y_pred)

plt.scatter(x, y)
plt.scatter(x_new, y_pred)
plt.xlabel('x')
plt.ylabel('y')
plt.show()   # x값을 토대로 예측한 y_pred 좌표 그래프에 표시해 보면 예측이 잘된 것을 확인할 수 있음

--

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()   # 위에 있는 장황한 코드들을 통해 얻은 최종 예측 파이썬 코드