Linear Regression
์ ํ ํ๊ท (linear regression)
: ๊ฐ์ฅ ํ๋ฅญํ ์์ธก์ ๊ธ๊ธฐ
๋ ๋ฆฝ ๋ณ์ x ๋ฅผ ์ฌ์ฉํด ์ข ์ ๋ณ์ y์ ์์ง์์ ์์ธกํ๊ณ ์ค๋ช ํ๋ ์์
x ๊ฐ๋ง์ผ๋ก๋ y ๊ฐ์ ์ค๋ช ํ ์ ์์ ๋ ๋จ์ ์ ํ ํ๊ท (simple linear regresssion)
x ๊ฐ์ด ์ฌ๋ฌ๊ฐ๊ฐ ํ์ํ ๋๋ ๋ค์ค ์ ํ ํ๊ท (multiple linear regression)
์ผ์ฐจ ํจ์ ๊ทธ๋ํ์ ์ Hypothesis : H(x) = Wx + b y = ax + b
์ต์ ์ ๊ณฑ๋ฒ (method of least squares)
: ์ ํํ ์ง์ ์ ๊ธ์ ์ ์๋ ๊ณต์
x์ ํธ์ฐจ(๊ฐ ๊ฐ๊ณผ ํ๊ท ๊ณผ์ ์ฐจ์ด)๋ฅผ ์ ๊ณฑํด์ ํฉํ ๊ฐ์ ๋ถ๋ชจ๋ก ๋๊ณ , x์ y์ ํธ์ฐจ๋ฅผ ๊ณฑํด์ ํฉํ ๊ฐ์ ๋ถ์๋ก ๋์ผ๋ฉด ๊ธฐ์ธ๊ธฐ๊ฐ ๋์จ๋ค
ex) ๊ณต๋ถ๋์ ๋ฐ๋ฅธ ์ฑ์ ์ ์์ธก
TIP) ์ต์ ์ ๊ณฑ๋ฒ์ ์ฃผ์ด์ง x์ ๊ฐ์ด ํ๋์ผ ๋ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ x๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ด์ฉํ๋ค
์ต์ ์ ๊ณฑ๋ฒ์ ์ด์ฉํ ์ ํ ํ๊ท
import numpy as np
# x ๊ฐ๊ณผ y๊ฐ
x=[2, 4, 6, 8]
y=[81, 93, 91, 97]
# x์ y์ ํ๊ท ๊ฐ
# mean () : ๋ชจ๋ ์์์ ํ๊ท ์ ๊ตฌํ๋ ๋ํ์ด ํจ์
mx = np.mean(x)
my = np.mean(y)
print("x์ ํ๊ท ๊ฐ:", mx)
print("y์ ํ๊ท ๊ฐ:", my)
# ๊ธฐ์ธ๊ธฐ ๊ณต์์ ๋ถ๋ชจ
divisor = sum([(mx - i)**2 for i in x])
# sum()์ ์๊ทธ๋ง์ ํด๋นํ๋ ํจ์ ์ด๋ค
# **2 ๋ ์ ๊ณฑ์ ๊ตฌํ๋ผ๋ ์๋ฏธ
# for i in x๋ x์ ๊ฐ ์์๋ฅผ ํ๋ฒ์ฉ i ์๋ฆฌ์ ๋์
ํ๋ผ๋ ์๋ฏธ
# ๊ธฐ์ธ๊ธฐ ๊ณต์์ ๋ถ์ : (x - xํ๊ท )*(y - yํ๊ท )์ ํฉ
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)
print("๋ถ๋ชจ:", divisor)
print("๋ถ์:", dividend)
# ๊ธฐ์ธ๊ธฐ์ y ์ ํธ ๊ตฌํ๊ธฐ
a = dividend / divisor
b = my - (mx*a)
# ์ถ๋ ฅ์ผ๋ก ํ์ธ
print("๊ธฐ์ธ๊ธฐ a =", a)
print("y ์ ํธ b =", b)
์ถ๋ ฅ ๊ฐ
x์ ํ๊ท ๊ฐ: 5.0
y์ ํ๊ท ๊ฐ: 90.5
๋ถ๋ชจ: 20.0
๋ถ์: 46.0
๊ธฐ์ธ๊ธฐ a = 2.3
y ์ ํธ b = 79.0
ํ๊ท ์ ๊ณฑ ์ค์ฐจ (mean square error: MSE)
: ์ต์ ์ ๊ณฑ๋ฒ์ ์ด์ฉํด ๊ฐ์ฅ ํ๋ฅญํ ์ง์ ์ ๊ทธ๋ ธ์ง๋ง, ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค. ์ด๋ ๊ฒ ์ฌ๋ฌ๊ฐ์ ์ ๋ ฅ ๊ฐ์ ๊ณ์ฐํ ๋๋ ์์์ ์ ์ ๊ทธ๋ฆฌ๊ณ ๋ ํ, ์ด ์ ์ด ์ผ๋ง๋ ์ ๊ทธ๋ ค์ก๋์ง๋ฅผ ํ๊ฐํ์ฌ ์กฐ๊ธ์ฉ ์์ ํด ๊ฐ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ์ด๋ฅผ์ํด ์ฃผ์ด์ง ์ ์ ์ค์ฐจ๋ฅผ ํ๊ฐํ๋ ์ค์ฐจ ํ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๋ฉฐ, ํ๊ท ์ ๊ณฑ ์ค์ฐจ๊ฐ ๋ง์ด ์ฌ์ฉ๋๋ค.
์์์ ์ง์ ์ ๊ทธ์ด ์ด์ ๋ํ ํ๊ท ์ ๊ณฑ ์ค์ฐจ๋ฅผ ๊ตฌํ๊ณ , ์ด ๊ฐ(์ค์ฐจ)์ ๊ฐ์ฅ ์๊ฒ ๋ง๋ค์ด์ฃผ๋ a์ b ๊ฐ์ ์ฐพ์ ๊ฐ๋ ์์

y^๋ x์ ๋์ํ๋ '์ค์ ๊ฐ'์ด๊ณ y๋ x๊ฐ ๋์ ๋์์ ๋ ์ง์ ์ ๋ฐฉ์ ์์ ๋ง๋๋ '์์ธก๊ฐ'์ด๋ค.
์๋ฅผ ๋ค์ด, 2์๊ฐ ๊ณต๋ถํ์ ๋์ ์ค์ ๋์จ ์ ์(00์ )์ ๊ทธ๋ํ y = ax + b์์ x = 0 ๋ฅผ ๋์ ํ์ ๋ (00์ )์ ์ฐจ์ด๋ฅผ ์ค์ฐจ๋ผ ํ๋ค
ํ๊ท ์ ๊ณฑ ์ค์ฐจ๋ฅผ ์ด์ฉํ ์ ํ ํ๊ท
๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๊ณต๋ถํ ์๊ฐ๊ณผ ์ด์ ๋ฐ๋ฅธ ์ฑ์ ์ ํ๊ท ์ ๊ณฑ ์ค์ฐจ๋ฅผ ์ด์ฉ
import numpy as np
#๊ฐ์์ ๊ธฐ์ธ๊ธฐ a์ y ์ ํธ b
fake_a_b=[3,76]
# x ๊ฐ๊ณผ y๊ฐ
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
# y=ax + b์ a,b ๊ฐ ๋์
ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํจ์
def predict(x):
return fake_a_b[0]*x + fake_a_b[1]
# MSE ํจ์ (ํ๊ท ์ ๊ณฑ ๊ณต์)
def mse(y, y_hat):
return ((y - y_hat) ** 2).mean()
# ์์ธก๊ฐ(y_hat)๊ณผ ์ค์ ๊ฐ(y)์ ๊ฐ๊ฐ mse ()๋ผ๋ ํจ์์ y_hat์ y์๋ฆฌ์ ์
๋ ฅํด์ ํ๊ท ์ ๊ณฑ์ ๊ตฌํ๋ค
# MSE ํจ์๋ฅผ ๊ฐ y๊ฐ์ ๋์
ํ์ฌ ์ต์ข
๊ฐ์ ๊ตฌํ๋ ํจ์
def mse_val(predict_result,y):
return mse(np.array(predict_result), np.array(y))
# ์์ธก๊ฐ์ด ๋ค์ด๊ฐ ๋น ๋ฆฌ์คํธ
predict_result = []
# ๋ชจ๋ x๊ฐ์ ํ ๋ฒ์ฉ ๋์
ํ์ฌ 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])))
# ์ต์ข
MSE ์ถ๋ ฅ
print("MSE ์ต์ข
๊ฐ: " + str(mse_val(predict_result,y)))
์ถ๋ ฅ๊ฐ ๊ณต๋ถ์๊ฐ=2, ์ค์ ์ ์=81, ์์ธก์ ์=82 ๊ณต๋ถ์๊ฐ=4, ์ค์ ์ ์=93, ์์ธก์ ์=88 ๊ณต๋ถ์๊ฐ=6, ์ค์ ์ ์=91, ์์ธก์ ์=94 ๊ณต๋ถ์๊ฐ=8, ์ค์ ์ ์=97, ์์ธก์ ์=100 MSE ์ต์ข ๊ฐ: 11.0
Last updated
Was this helpful?