25.11.05 개발일지 딥러닝2(모두의 딥러닝 개정 4판)

2025. 11. 14. 09:18·LMS 7/개발일지

Chapter4 가장 훌륭한 예측선

1. 선형회귀(Linear Regression)

1) 정의

> 독립변수에 따라 종속변수의 움직임을 예측하고 설명하는 것

2) 종류

> 단순 선형 회귀(simple linear regression) : 하나의 독립변수

> 다중 선형 회귀(multiple linear regression) : 여러 개의 독립변수

​2. 예측선

> 독립변수에 들어갈 여러 데이터와 종속변수에 들어갈 여러 데이터를 통해 최적의 기울기와 최적의 절편값을 가진 선

​3. 최소 제곱법

> 최소 제곱법이란 여러 데이터를 통해 최적의 기울기와 절편을 구하는 방법

1) 기울기 공식

2) 절편 공식

​3.1 Python을 활용한 최소제곱법

import numpy as np

# 공부한 시간과 점수를 x, y 변수에 넘파이 배열로 저장
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

# x와 y의 평균을 구함
mx = np.mean(x)
my = np.mean(y)

# 기울기 공식------
# 분모((x - x 평균)^2의 합)
for i in x:
    divisor = sum((i - mx)**2)
# 분자((x - x 평균) X (y - y 평균)의 합)
def return_dividend(x, mx, y, my):
    d = 0
    if(len(x) == len(y)):
        for i in range(len(x)):
            d += (x[i] - mx) * (y[i] - my)
    return d
dividend = return_dividend(x, mx, y, my)
# 기울기
gradient = dividend / divisor

# 절편 공식
intercept = my - (mx * gradient)

# 출력
# 평균
print("x 평균 = ", mx)
print("y 평균 = ", my)
# 기울기
print("기울기 = ", gradient)
print("절편 = ", intercept)

4. 평균 제곱 오차(MeanSquareError, MSE)

> 다중선형회귀(독립변수가 여러개)의 경우 하나의 가설(하나의 직선)을 세운 후 오차(오차의 합)가 최소가 될 때까지 반복하는 작업을 하는데, 여기서 합리적인 오차를 구하는 법

​

1) 최소제곱법과 비교

> 최소제곱법은 기울기와 절편의 최적값을 구하고 이를 통해 최적의 직선을 구하는 방법임.

> 반면 평균제곱오차는 기울기와 절편에 어떤 값이든 대입하고, 이에 대한 오차를 최소화 하는 방식에서 차이가 있다.

​

2) 오차 공식

오차 = 실제 값 - 예측 값

​

3) 평균 제곱 오차 공식(여기서 y는 y = ax + b와 같은 식에 x를 대입했을 때 나오는 실제 값을 의미)

4) 실제 예

y = 3x + 76(임의의 직선)

공부시간(x)
2
4
6
8
실제성적(y)
81
93
91
97
예측성적
82
88
94
100
오차
-1
5
-3
-3

4.1 Python을 활용한 평균 제곱 오차

import numpy as np

# 임의의 기울기와 절편
fake_a = 3
fake_b = 76

# 리스트를 넘파이 배열로 변환하여 x, y 변수에 각각 저장
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

# 임의의 값들을 통해 생성된 예측값 함수
def predict(x):
    return fake_a * x + fake_b
# 예측값들을 저장하기 위한 리스트
predict_result = []
# 리스트에 예측값들을 추가, 출력
for i in range(len(x)):
    predict_result.append(predict(x[i]))
    print("공부시간=%f, 실제점수=%f, 예측점수=%f" % (x[i], y[i], predict(x[i])))
    
# 평균 제곱 오차를 구하는 함수
def mse(y, y_pred):
    return (1/len(x)) * sum((y - y_pred)**2)
# 출력
print("평균 제곱 오차: " + str(mse(y, predict_result)))


Chapter05. 선형 회귀 모델

> 앞서 최소제곱법과 평균제곱오차는 최적의 기울기와 절편을 구하는 것이 목적이였는데,

이 중 기울기는 너무 크거나 작다면 오차는 매우 커진다는 특징이 있음을 알 수 있다.

> 이는 기울기와 오차가 서로 2차 함수 관계가 있음을 의미함.​

1. 경사 하강법

> 2차 함수의 꼭짓점의 기울기(미분 값이 0)를 찾는 과정

1) 방법

> 임의의 지점에서 미분 값을 구함

> 임의의 지점의 반대 방향으로 임의의 거리를 이동시킨 지점에서 미분 값을 구함

> 미분 값이 0이 아니라면 위 두 과정을 반복

​

2) 학습률(learning rate)

> 임의 지점에서 반대 방향으로 임의 거리를 이동해야하는데, 여기서 어느정도를 이동시킬지 결정하는 요소​

1.1 Python을 활용한 경사 하강법

import numpy as np
import matplotlib.pyplot as plt # 그래프 관련 라이브러리

#공부시간(x), 성적(y)의 넘파이 배열 생성
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

#그래프로 표현
plt.scatter(x,y)
plt.show()

#기울기 및 절편, 학습률, 에포크, 길이 초기화
a = 0
b = 0
lr = 0.03
epochs = 2001
n = len(x)

#경사 하강법
for i in range(epochs):
    y_pred = a * x + b
    error = y - y_pred
    
    a_diff = (2/n) * sum(-x * error)
    b_diff = (2/n) * sum(-error)
    
    a = a - lr * a_diff
    b = b - lr * b_diff
    
    if i % 100 == 0:
        print("epoch = %f, 기울기 = %04f, 절편 = %04f" % (i, a, b))

y_pred = a*x + b

plt.scatter(x, y)
plt.plot(x, y_pred, 'r')
plt.show()

2. Python을 활용한 다중선형회귀

> 단순선형회귀가 독립변수와 종속변수의 관계를 추적하는 것이라면 다중선형회귀는 여러 독립변수와 종속변수의 관계를 추적하는 것

import numpy as np
import matplotlib.pyplot as plt # 그래프 관련 라이브러리

#공부시간(x1), 과외시간(x2), 성적(y)의 넘파이 배열 생성
x1 = np.array([2, 4, 6, 8])
x2 = np.array([0, 4, 2, 3])
y = np.array([81, 93, 91, 97])

#3차원 그래프로 표현
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x1, x2, y)
plt.show()

#기울기 및 절편, 학습률, 에포크, 길이 초기화
a1 = 0
a2 = 0
b = 0
lr = 0.01
epochs = 2001
n = len(x1)

#경사 하강법
for i in range(epochs):
    y_pred = a1 * x1 + a2 * x2 + b
    error = y - y_pred
    
    a1_diff = (2/n) * sum(-x1 * error)
    a2_diff = (2/n) * sum(-x2 * error)
    b_diff = (2/n) * sum(-error)
    
    a1 = a1 - lr * a1_diff
    a2 = a2 - lr * a2_diff
    b = b - lr * b_diff
    
    if i % 100 == 0:
        print("epoch = %f, 기울기1 = %04f, 기울기2 = %0.4f, 절편 = %04f" % (i, a1, a2, b))

print("실제 점수 : ", y)
print("예측 점수 : ", y_pred)

3. 텐서플로를 활용한 선형 회귀, 다중 선형 회귀

1) 용어변경

y = ax + b >> H(x) = wx + b

> H(x) : 가설 함수(hypothesis)

> w : 가중치(weight)

> b : 편향(bias)

평균 제곱 오차 >> 손실 함수(loss function)

경사 하강법 >> 옵티마이저 (optimizer)

 

2) 선형 회귀

import numpy as np
import matplotlib.pyplot as plt

# 텐서플로 케라스 API
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear')) # 출력값(H(x)), 입력값(x), 활성화 함수(선형회귀)
model.compile(optimizer='sgd', loss='mse') # 옵티마이저(sgd = 경사하강법), 손실 함수(mse = 평균 제곱 오차)
model.fit(x, y, epochs=500) # 에포크 설정

# 그래프 그리기
plt.scatter(x, y)
plt.plot(x, model.predict(x), 'r')
plt.show()

# 테스트
hour = 7
input_data = tf.constant([[hour]])
prediction = model.predict(input_data)[0][0]
print("%f 시간을 공부할 경우 예상 점수는 %02f점 입니다." % (hour, prediction))

 

3) 다중 선형 회귀

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 텐서플로 케라스 API
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

x = np.array([[2, 0], [4, 4], [6, 2], [8, 3]]) # 원소가 공부시간, 과외시간 두 개
y = np.array([81, 93, 91, 97])

model = Sequential()
model.add(Dense(1, input_dim=2, activation='linear')) # 출력값(H(x)), 입력값들(x), 활성화 함수(선형회귀)
model.compile(optimizer='sgd', loss='mse') # 옵티마이저(sgd = 경사하강법), 손실 함수(mse = 평균 제곱 오차)
model.fit(x, y, epochs=500) # 에포크 설정

# 테스트
hour = 6
private_class = 3
input_data = tf.constant([[hour, private_class]])
prediction = model.predict(input_data)[0][0]
print("%f 시간을 공부하고 %f시간의 과외를 받을 경우, 예상 점수는 %02f점 입니다." % (hour, private_class, prediction))

'LMS 7 > 개발일지' 카테고리의 다른 글

25.11.09 개발일지 / 딥러닝4  (1) 2025.11.14
25.11.06 개발일지 / 딥러닝3  (0) 2025.11.14
25.11.03 개발일지 / 딥러닝 1(모두의 딥러닝 개정4판)  (0) 2025.11.14
25.10.30 개발일지 / C++ MFC 프로젝트 5일차  (0) 2025.11.14
25.10.29 개발일지 / C++ MFC 프로젝트 4일차  (0) 2025.11.14
'LMS 7/개발일지' 카테고리의 다른 글
  • 25.11.09 개발일지 / 딥러닝4
  • 25.11.06 개발일지 / 딥러닝3
  • 25.11.03 개발일지 / 딥러닝 1(모두의 딥러닝 개정4판)
  • 25.10.30 개발일지 / C++ MFC 프로젝트 5일차
m_Dev
m_Dev
  • m_Dev
    m_Dev
    m_Dev
  • 전체
    오늘
    어제
    • 분류 전체보기
      • MAIN STUDY
        • 정보보안
        • 빅데이터
        • 정보처리
        • 컴퓨터 구조
        • 기타
      • JOB
        • Study
        • Project
      • LMS 7
        • 개발일지
      • FRAMEWORK
        • Qt
        • MFC
        • Winform
        • WPF
        • MAUI
      • NETWORK
        • Study
        • Assignment
      • PYTHON
        • Set
        • Study
        • Assignment
        • Project
      • C
        • Set
        • Study
        • Assignment
        • Project
      • C++
        • Set
        • Study
        • Assignment
        • Project
      • C#
        • Set
        • Study
        • Assignment
        • Project
      • DATABASE
        • MySQL
        • SQLite
      • IDE
        • VisualStudioCode
        • VisualStudio
        • Pycharm
        • Colab
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
m_Dev
25.11.05 개발일지 딥러닝2(모두의 딥러닝 개정 4판)
상단으로

티스토리툴바