David의 개발 이야기!

Linear Regression 바닥부터 구현하기 ( bias 없을때 ) 본문

인공지능공부

Linear Regression 바닥부터 구현하기 ( bias 없을때 )

david.kim2028 2023. 7. 14. 17:07
반응형

 

이런 문제를 해결하기 위해, 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)

 

 

반응형
Comments