일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 선형대수학
- 42서울
- filtering
- mnist
- Regression
- 머신러닝
- 42경산
- AI
- 피플
- 앱개발
- 크롤러
- 코딩애플
- pytorch
- map
- 회귀
- 인공지능
- 파이썬
- 선형회귀
- Computer Vision
- 모델
- 플러터
- 데이터분석
- 크롤링
- 자연어처리
- 지정헌혈
- 유데미
- 딥러닝
- Flutter
- RNN
- CV
Archives
- Today
- Total
David의 개발 이야기!
Linear Regression 바닥부터 구현하기 ( bias 없을때 ) 본문
반응형
이런 문제를 해결하기 위해, Linear Regression 을 공부해보자.
우선 이번 포스팅에서는, Linear Regression 을 바닥부터 손수 구현해보고자 한다.
1. 주어진 데이터 시각화하기
import matplotlib.pyplot as plt
X = [1, 2, 3, 4, 5, 6, 7]
Y = [25000, 55000, 75000, 110000, 128000, 155000, 180000]
plt.plot(X, Y)
plt.scatter(X, Y)
2. Linear Regression 이해하기
왼쪽 수식을 아래 코드상 get_gradient_using_deriative(self, X, Y) 로 구현
3. Linear Regression 코드로 구현해보기
# 가설 모델(학습 시킬 대상)
class H():
def __init__(self, w):
self.w = w
# 결과를 반환하는 함수
def forward(self, x):
return self.w * x
# 가설의 비용을 구하는 함수(낮추어야 할 대상)
def get_cost(self, X, Y):
cost = 0
for i in range(len(X)):
cost += (self.forward(X[i]) - Y[i]) ** 2
cost = cost / len(X)
return cost
# 기울기를 계산하는 함수
def get_gradient(self, X, Y):
cost = self.get_cost(X, Y)
dw = 0.001
self.w = self.w + dw
next_cost = self.get_cost(X, Y)
self.w = self.w - dw
dcost = next_cost - cost
gradient = dcost / dw
return gradient, next_cost
# 미분으로 기울기를 계산하는 함수
def get_gradient_using_derivative(self, X, Y):
gradient= 0
for i in range(len(X)):
gradient += (h.forward(X[i]) - Y[i]) * X[i]
gradient = 2 * gradient / len(X)
cost = self.get_cost(X, Y)
return gradient, cost
# w 값을 변경하는 함수
def set_w(self, w):
self.w = w
# w 값을 반환하는 함수
def get_w(self):
return self.w
*get_gradient 함수
: 미분정의를 활용해서 직접 구하는 것임
4. 가중치(W)에 따른 비용 확인
cost_list = []
w_list = []
# w를 -300,000부터 300,000까지 바꾸어 보며 비용 확인
for i in range(-300, 300):
w = i * 1000
h = H(w)
cost = h.get_cost(X, Y)
w_list.append(w)
cost_list.append(cost)
# 결과적으로 약 25,000 정도일 때 최소 비용임을 확인
plt.figure(figsize=(8, 8))
plt.scatter(w_list, cost_list, s=10)
5. 학습 진행하기
*아래 코드에서는 초기 w 를 설정해두고 시작하였다.
1) 미분 안쓰고 그냥 기울기 구한 코드
w = 4
h = H(w)
learning_rate = 0.001
for i in range(1001):
gradient, cost = h.get_gradient(X, Y)
h.set_w(h.get_w() + learning_rate * -gradient)
if i % 100 == 0:
print("[ epoch: %d, cost: %.2f ]" % (i, cost))
print("w = %.2f, w_gradient = %.2f" % (h.get_w(), gradient))
print("f(x) = %.2fx" %(h.get_w()))
print("예측값: [%.2f]" %(h.forward(8)))
2) 미분으로 기울기 구한 코드
w = 4
h = H(w)
learning_rate = 0.001
for i in range(1001):
gradient, cost = h.get_gradient_using_derivative(X, Y)
h.set_w(h.get_w() + learning_rate * -gradient)
if i % 100 == 0:
print("[ epoch: %d, cost: %.2f ]" % (i, cost))
print("w = %.2f, w_gradient = %.2f" % (h.get_w(), gradient))
print("f(x) = %.2fx" %(h.get_w()))
print("예측값: [%.2f]" %(h.forward(8)))
미분정의를 활용해서 구하나, 편미분을 활용해서 기울기를 구한 값이나, 결국엔 동일함을 확인할 수 있다!
6. 학습 결과
x_pred = [i for i in range(11)]
y_pred = [h.get_w() * i for i in range(11)]
plt.plot(x_pred, y_pred)
plt.scatter(X, Y)
반응형
'인공지능공부' 카테고리의 다른 글
Linear Regression Pytorch 로 구현하기 (0) | 2023.07.23 |
---|---|
Linear Regression 밑바닥부터 구현하기2 ( bias 포함 ) (0) | 2023.07.23 |
Matplotlib 에 대해 알아보자! (0) | 2023.07.07 |
Pandas 에 대해 알아보자 feat. Series, DataFrame (0) | 2023.07.07 |
OpenCV 에 대해 알아보자 (0) | 2023.07.07 |
Comments