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 |