머신러닝/직접 구현

[Python] Numpy 로 LinearRegression을 구현해보자!!

2023. 6. 13. 17:21
목차
  1. 1. 코드

1. 코드

import numpy as np
In [122]:
# Make Dummy Data

data_num = 1000

# feature 값 생성
X1 = np.random.randn(data_num)
X2 = np.random.randn(data_num)
X3 = np.random.randn(data_num)

# 노이즈
noise = np.random.normal(0,5,data_num)

# target 값 생성
y = 30 * X1 - 20 * X2 + 12 *X3 +10+ noise


X = np.array([X1,X2,X3]).T

 

이렇게 되는 이유를 자세히 알고 싶으면 아래 사이트를 참고

gradient_weights =  -(1/self.data_num) * np.dot(X.T , error)
gradient_bias =  -(1/self.data_num) * np.sum(error)

출처 :https://computer-nerd.tistory.com/5

In [127]:
# cost function = MSE

class LinearRegressor:
    def __init__(self , epochs = 100 , lr = 0.01):
        # 편향을 0으로 설정
        self.bias = 0

        # loss값을 저장할 리스트
        self.loss_log = []

        self.epochs = epochs
        self.lr = lr

    def fit(self, X , y):
        self.data_num, self.feat_num = X.shape

        # weight 값 초기화
        self.weights = np.ones(self.feat_num)
        
        for n in range(self.epochs):
            # y 값 예측
            y_hat = np.dot(X , self.weights) + self.bias
            
            # error 값 구하기
            error = y - y_hat

            # Mean square Error 구하기 
            mse = np.square(error).mean()
            self.loss_log.append(mse)

            # Gradient Descent 를 이용하여 weight , bias 업데이트 
            
            ## weight , bias 별 gradient 값 구하기
            
            gradient_weights =  -(1/self.data_num) * np.dot(X.T , error)
            gradient_bias =  -(1/self.data_num) * np.sum(error)

            ## weight 값 update
            self.weights = self.weights - self.lr * gradient_weights 
            self.bias = self.bias - self.lr *  gradient_bias

            # 주석 풀고 
            # print(f'epoch : {n+1} \n MSE : {mse}')

    def predict(self , X):
        return np.dot(self.weights , X) + self.bias
    
    def show_loss_log(self):
        for loss in self.loss_log:
            print (loss)
        return self.loss_log
In [128]:
lr=LinearRegressor()
In [129]:
lr.fit(X=X,y=y)
epoch : 1 
 MSE : 1575.316463147643
epoch : 2 
 MSE : 1543.2913120040535
epoch : 3 
 MSE : 1511.9294656241652
epoch : 4 
 MSE : 1481.2171577261122
epoch : 5 
 MSE : 1451.1409082496561
epoch : 6 
 MSE : 1421.6875173957083
epoch : 7 
 MSE : 1392.8440597901556
epoch : 8 
 MSE : 1364.5978787693875
epoch : 9 
 MSE : 1336.9365807849902
epoch : 10 
 MSE : 1309.8480299251128
epoch : 11 
 MSE : 1283.3203425500765
epoch : 12 
 MSE : 1257.3418820398363
epoch : 13 
 MSE : 1231.9012536509636
epoch : 14 
 MSE : 1206.9872994808595
epoch : 15 
 MSE : 1182.5890935369648
epoch : 16 
 MSE : 1158.69593690877
epoch : 17 
 MSE : 1135.2973530404836
epoch : 18 
 MSE : 1112.3830831022537
epoch : 19 
 MSE : 1089.9430814578882
epoch : 20 
 MSE : 1067.9675112270602
epoch : 21 
 MSE : 1046.4467399400194
epoch : 22 
 MSE : 1025.37133528289
epoch : 23 
 MSE : 1004.7320609316547
epoch : 24 
 MSE : 984.5198724729764
epoch : 25 
 MSE : 964.7259134100499
epoch : 26 
 MSE : 945.3415112516994
epoch : 27 
 MSE : 926.3581736829947
epoch : 28 
 MSE : 907.7675848156783
epoch : 29 
 MSE : 889.5616015167384
epoch : 30 
 MSE : 871.7322498135003
epoch : 31 
 MSE : 854.2717213736357
epoch : 32 
 MSE : 837.172370058528
epoch : 33 
 MSE : 820.4267085484644
epoch : 34 
 MSE : 804.0274050381516
epoch : 35 
 MSE : 787.9672800010943
epoch : 36 
 MSE : 772.2393030213922
epoch : 37 
 MSE : 756.8365896915545
epoch : 38 
 MSE : 741.7523985749527
epoch : 39 
 MSE : 726.9801282315606
epoch : 40 
 MSE : 712.5133143056661
epoch : 41 
 MSE : 698.3456266742568
epoch : 42 
 MSE : 684.4708666548166
epoch : 43 
 MSE : 670.8829642712936
epoch : 44 
 MSE : 657.5759755770237
epoch : 45 
 MSE : 644.5440800334255
epoch : 46 
 MSE : 631.7815779432981
epoch : 47 
 MSE : 619.2828879375879
epoch : 48 
 MSE : 607.0425445145055
epoch : 49 
 MSE : 595.0551956299017
epoch : 50 
 MSE : 583.3156003378343
epoch : 51 
 MSE : 571.8186264802778
epoch : 52 
 MSE : 560.559248424951
epoch : 53 
 MSE : 549.5325448502604
epoch : 54 
 MSE : 538.7336965763737
epoch : 55 
 MSE : 528.1579844414657
epoch : 56 
 MSE : 517.8007872221888
epoch : 57 
 MSE : 507.6575795974531
epoch : 58 
 MSE : 497.72393015460506
epoch : 59 
 MSE : 487.9954994371268
epoch : 60 
 MSE : 478.4680380329866
epoch : 61 
 MSE : 469.1373847027952
epoch : 62 
 MSE : 459.99946454693514
epoch : 63 
 MSE : 451.05028721085387
epoch : 64 
 MSE : 442.28594512772236
epoch : 65 
 MSE : 433.7026117976806
epoch : 66 
 MSE : 425.2965401029085
epoch : 67 
 MSE : 417.06406065777315
epoch : 68 
 MSE : 409.00158019332343
epoch : 69 
 MSE : 401.1055799754135
epoch : 70 
 MSE : 393.3726142557565
epoch : 71 
 MSE : 385.7993087552201
epoch : 72 
 MSE : 378.38235917869287
epoch : 73 
 MSE : 371.11852976086266
epoch : 74 
 MSE : 364.0046518422633
epoch : 75 
 MSE : 357.0376224749582
epoch : 76 
 MSE : 350.21440305724286
epoch : 77 
 MSE : 343.5320179967629
epoch : 78 
 MSE : 336.9875534014527
epoch : 79 
 MSE : 330.57815579771807
epoch : 80 
 MSE : 324.3010308752924
epoch : 81 
 MSE : 318.1534422582114
epoch : 82 
 MSE : 312.13271030136275
epoch : 83 
 MSE : 306.236210912077
epoch : 84 
 MSE : 300.4613743962373
epoch : 85 
 MSE : 294.8056843283988
epoch : 86 
 MSE : 289.266676445415
epoch : 87 
 MSE : 283.8419375630837
epoch : 88 
 MSE : 278.5291045153312
epoch : 89 
 MSE : 273.32586311546544
epoch : 90 
 MSE : 268.2299471390386
epoch : 91 
 MSE : 263.23913732786923
epoch : 92 
 MSE : 258.3512604147824
epoch : 93 
 MSE : 253.56418816863592
epoch : 94 
 MSE : 248.8758364592113
epoch : 95 
 MSE : 244.28416434155443
epoch : 96 
 MSE : 239.7871731593616
epoch : 97 
 MSE : 235.3829056670132
epoch : 98 
 MSE : 231.06944516986772
epoch : 99 
 MSE : 226.84491468243488
epoch : 100 
 MSE : 222.70747610405616
In [130]:
## loss값 변화량

import matplotlib.pyplot as plt
plt.plot(range(1,101) ,lr.loss_log)
Out[130]:
[<matplotlib.lines.Line2D at 0x168de8940>]
  • 1. 코드
easysheep
easysheep
easysheep
나의 개발자 일기
easysheep
전체
오늘
어제
  • 분류 전체보기 (95)
    • 파이썬 (7)
      • 자료형 (0)
      • matplotlib (2)
      • Tensorflow (1)
      • Selenium (1)
      • Numpy (2)
      • Pandas (1)
    • 장난감 프로젝트 (3)
    • AI_수학 (0)
      • 통계 (0)
    • 알고리즘 (63)
      • 브루트 포스 (3)
      • 그리드 알고리즘 (5)
      • 너비 우선 탐색(bfs) (12)
      • 깊이 우선 탐색(DFS) (1)
      • 최단 경로 구하기(플로이드 워셜) (1)
      • 동적 계획법(Dynamic Programming) (8)
      • Dijkstra algorithm(데이크스트라 알.. (6)
    • Backend (1)
      • Django (1)
    • 딥러닝 (1)
      • Regression(회귀) (0)
    • 머신러닝 (3)
      • Daycon (1)
      • 직접 구현 (1)
    • AWS (3)
    • DB (2)
      • MongoDB (2)
    • kubernetes (3)
    • Docker (4)
    • Stress Test Toll (0)
      • Jmeter (0)
      • nGrinder (0)
    • Ubuntu (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • Docker
  • Python
  • 데이크스트라
  • 헬름 설치
  • Bind Mounts
  • 알고리즘
  • error
  • ML
  • 문자열
  • Numpy
  • heap
  • grafana
  • gradio
  • 2*n 타일링
  • ubuntu
  • BFS
  • dynamic programming
  • error: version in "./docker-compose.yaml" is unsupported.
  • matplotlib
  • 너비 우선 탐색
  • aws
  • 머신 러닝
  • 파이썬
  • mysql
  • validate service connection
  • Cannot stat file /proc/528/fd/0: Permission denied
  • 우분투에 헬름 설치
  • Mac
  • helm

최근 댓글

최근 글

hELLO · Designed By 정상우.
easysheep
[Python] Numpy 로 LinearRegression을 구현해보자!!
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.