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() # 위에 있는 장황한 코드들을 통해 얻은 최종 예측 파이썬 코드
'프로그래머스 데브 코스 > TIL' 카테고리의 다른 글
[6기] 프로그래머스 인공지능 데브코스 33일차 TIL (0) | 2023.10.03 |
---|---|
[6기] 프로그래머스 인공지능 데브코스 32일차 TIL (0) | 2023.10.02 |
[6기] 프로그래머스 인공지능 데브코스 30일차 TIL (0) | 2023.09.30 |
[6기] 프로그래머스 인공지능 데브코스 29일차 TIL (0) | 2023.09.29 |
[6기] 프로그래머스 인공지능 데브코스 28일차 TIL (0) | 2023.09.28 |