AI

AI_Basic ) ์„ ํ˜•ํšŒ๊ท€ ( Linear Regression ) ์ด๋ก ๋ถ€ํ„ฐ ๊ตฌํ˜„ ( OLS, ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• )

proggg 2024. 11. 6. 23:28
728x90

 

https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80

 

์„ ํ˜• ํšŒ๊ท€ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๋…๋ฆฝ๋ณ€์ˆ˜ 1๊ฐœ์™€ ์ข…์†๋ณ€์ˆ˜ 1๊ฐœ๋ฅผ ๊ฐ€์ง„ ์„ ํ˜• ํšŒ๊ท€์˜ ์˜ˆ ํ†ต๊ณ„ํ•™์—์„œ ์„ ํ˜• ํšŒ๊ท€(็ทšๅž‹ๅ›žๆญธ, ์˜์–ด: linear regression)๋Š” ์ข…์† ๋ณ€์ˆ˜ y์™€ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋…๋ฆฝ ๋ณ€์ˆ˜ (๋˜๋Š” ์„ค๋ช…

ko.wikipedia.org

 

์„ ํ˜•ํšŒ๊ธฐ๋Š” ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ " ์˜ˆ์ƒ๋˜๋Š” ๊ฐ’์ด 00์ด๋‹ค " ๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•œ ์˜์—ญ์ด๋‹ค.

 

์„ ํ˜•ํšŒ๊ธฐ์—์„œ๋Š” ์˜ˆ์ƒ๊ฐ’(์ถ”์ •๋˜๋Š” ๊ฐ’)์ด ์„ ํ˜•์ผ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ์„ ํ˜•์ด๋ผ๋ฉด,

์–ด๋–ค ์„ ํ˜•์˜ ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๊ฐ€

๋ชฉ์ ์— ๊ฑธ๋งž๋Š” ๊ฒฝํ–ฅ์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋•Œ ๊ฒฝํ–ฅ์„ฑ์„ ์ฐพ๊ธฐ ์œ„ํ•ด Cost Function , ์ฆ‰ ์˜ค์ฐจ๊ฐ€ ์ ์€ ๋ฐฉ์ •์‹(๊ฒฝํ–ฅ์„ฑ)์„ ์„ ์ •ํ•œ๋‹ค.

 

 

 

 

์˜ˆ์ธก ๋œ ๊ฐ’ H(x) ์—์„œ y ์‹ค์ œ ๊ฐ’์„ ๋บ€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์ œ๊ณฑํ•˜์—ฌ "์˜ค์ฐจ์˜ ์ •๋„" ์Šค์นผ๋ผ๋กœ ์น˜ํ™˜ํ•˜๊ณ  ํ‰๊ท ์„ ๋‚ธ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์„ ํ˜•ํšŒ๊ท€์˜ ๋ชฉ์ ์€

 

์ฆ‰ ์˜ˆ์ธก๊ฐ’์ด ์˜ค์ฐจํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ "์„ ์ •"ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

์„ ํ˜•ํšŒ๊ท€์˜ ๋ชฉํ‘œ๋Š” Wx+b ์˜ ์„ ํ˜•ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š”๊ฒƒ์ด๋‹ค. w์˜ ๊ฐ’์€ ์•„๋ž˜์˜ ์‹๊ณผ ๋™์ผํ•œ๋ฐ ์—ฌ๊ธฐ์„œ b0 ๊ฐ€ w์ด๋‹ค.

 

 

์—๋ผ์ด, ์ผ๋‹จ ๋ ˆ์ธ  ๋‘ ์ž‡, ํšŒ๊ท€๋ถ„์„ - OLS Regression ์†์œผ๋กœ ํ’€์–ด๋ณด๊ธฐ

์ž, ์ด์ œ๊นŒ์ง€ ํšŒ๊ท€์— ๋Œ€ํ•ด์„œ ๊ณ„์† ๋ง๋งŒ ๊บผ๋ƒˆ์ง€, ์‹ค์ œ๋กœ ํšŒ๊ท€๋ฅผ ํ•ด๋ณด์ง€ ์•Š์•˜์œผ๋‹ˆ๊นŒ, ์„œํˆด๋”๋ผ๋„ ํšŒ๊ท€๋ผ๋Š” ๊ฒƒ์„ ํ•œ๋ฒˆ ํ•ด๋ณด์ž๊ณ ์š”. - ๋ถ„์„ ๊ฒฐ๊ณผ์˜ ํ•ด์„์€ ์ด๊ฑธ ํ•ด ๋ณด๊ณ  ํ•˜๋Š” ๊ฒƒ์œผ๋กœ... ์•„์ง์€ ํšŒ๊ท€์—

recipesds.tistory.com

 

์ž์„ธํ•œ ์œ ๋„๋Š” ์œ„์˜ ๋งํฌ๋ฅผ ์ฐธ์กฐ

 

์ด๋Š” cor(x,y)/var(x) ๊ผด์ธ๋ฐ, x์˜ ๋ถ„์‚ฐ ๋ณ€ํ™”๋Ÿ‰์— ๋Œ€ํ•œ x,y ์˜ ๊ณต๋ถ„์‚ฐ ๋ณ€ํ™”๋Ÿ‰์˜ ๊ฒฝํ–ฅ์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

 

 

์•„๋ž˜๋Š” ๊ตฌํ˜„์—๋Œ€ํ•œ ์ฝ”๋“œ์ด๋‹ค.

import pandas as pd
import numpy as np

'''
reference : ๊ฐ„๋‹จํ•œ OLS ๊ตฌํ˜„ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
            Cor(x,y)/Var(x) ์˜ ํ˜•ํƒœ๋กœ ์„ ํ˜•ํšŒ๊ท€์˜ ๋ชฉ์ ์ธ ax+b ํ•จ์ˆ˜๋ฅผ ์ถ”์ •ํ•œ๋‹ค.
'''

x = [2,5,8,6]
y = [80,62,80,99]

mx = np.mean(x)
my = np.mean(y)

### OLS(Ordinary Least Square)
###
###

divisor = sum([(i-mx)**2 for i in x])
def top(x,mx,y,my):
  d = 0
  for i in range(len(x)):
    d += (x[i] - mx)*(y[i]-my)
  return d

dividend = top(x,mx,y,my)

a = dividend / divisor
b = my - (mx*a)

print(f"๊ธฐ์šธ๊ธฐ = {a}, y์ ˆํŽธ = {b}")

 

๊ฒฐ๊ณผ๊ฐ’์€ ax+b ๋ฅผ ์œ ์ถ”ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์šธ๊ธฐ์™€ ์ ˆํŽธ์ด๋‚˜์˜จ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฒฝํ–ฅ์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง์„ ์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์œผ๋กœ ์˜ˆ์ธก์„ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

import numpy as np

'''
reference : linear regression ์„ ์œ„ํ•œ ax+b ํ•จ์ˆ˜ ๊ตฌํ˜„๊ณผ ์˜ˆ์ธก ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
'''

fake_a = 13
fake_b = 86

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

def predict(x):
  return fake_a * x + fake_b

def real_predict(x):
  return a * x + b


predict_result = []

for i in range(len(x)): ### ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ax+b ๋ฅผ ๋งŒ๋“ค์–ด ์˜ˆ์ธกํ•จ.
  predict_result.append(predict(x[i]))
  print(f"Fake ax+b ๊ณต๋ถ€์‹œ๊ฐ„ ={x[i]}, ์‹ค์ œ์ ์ˆ˜ = {y[i]}, ์˜ˆ์ธก์ ์ˆ˜ = {predict_result[i]}")


predict_result = []

for i in range(len(x)): ### ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ cor(x,y)/var(x) x + b ๋ฅผ ๋งŒ๋“ค์–ด ์˜ˆ์ธกํ•จ.
  predict_result.append(real_predict(x[i]))
  print(f"Real ax+b ๊ณต๋ถ€์‹œ๊ฐ„ ={x[i]}, ์‹ค์ œ์ ์ˆ˜ = {y[i]}, ์˜ˆ์ธก์ ์ˆ˜ = {predict_result[i]}")

 

 

์œ„๋Š” ์ตœ์†Œ์ œ๊ณฑ๋ฒ•(OLS) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ax+b ์˜ ํ•จ์ˆ˜๋ฅผ ์ถ”์ •ํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜๋Š” ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•(Gradient Decsent )๋กœ ์„ ํ˜•ํšŒ๊ท€์‹์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.

'''
reference : linear regression ์— ํ™œ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ์ถ”์ • ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.
'''

a = 0
b=  0

lr = 0.03

x = np.array([2,4,8,6]) #์ž„์˜์˜ ๋ฐ์ดํ„ฐ ์„ค์ •
y = np.array([81,93,91,97])

epochs = 2001 # ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต์  ํ•™์Šต ํšŸ์ˆ˜

n = len(x)

for i in range(epochs):
  y_pred = a*x + b # ์ผ์ฐจ ๋ฐฉ์ •์‹
  error = y - y_pred # ์˜ค์ฐจ๊ฐ’ ๊ณ„์‚ฐ ( ์‹ค์ œ y ์™€ ์˜ˆ์ธกํ•œ y ์˜ ์ฐจ์ด๊ฐ’ = error )


  ## ํŽธ๋ฏธ๋ถ„
  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(f"epoch = {i}, ๊ธฐ์šธ๊ธฐ = {a}, y์ ˆํŽธ = {b}")

y_pred = a*x+b
plt.scatter(x,y)
plt.plot(x, y_pred,'r')
plt.show()

 

๊ฒฐ๋ก  : ์„ ํ˜•ํšŒ๊ท€๋Š” "๊ฐ’์„ ์˜ˆ์ธก" ํ•œ๋‹ค. ์˜ˆ์ธก๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ "์ž˜ ์˜ˆ์ธก"ํ•˜๋Š” ๊ฒฝํ–ฅ์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฐฉ์‹์œผ๋กœ๋Š” OLS ์™€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค.

728x90