๋ก์ง์คํฑ ํ๊ท์ ๋ชฉ์ ์ ์ผ๋ฐ์ ์ธ ํ๊ท ๋ถ์์ ๋ชฉํ์ ๋์ผํ๊ฒ ์ข ์ ๋ณ์์ ๋ ๋ฆฝ ๋ณ์๊ฐ์ ๊ด๊ณ๋ฅผ ๊ตฌ์ฒด์ ์ธ ํจ์๋ก ๋ํ๋ด์ด ํฅํ ์์ธก ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ ํ ํ๊ท ๋ถ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ข ์ ๋ณ์๊ฐ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก ํ๋ฉฐ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ก์ ๋ ํด๋น ๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๊ฐ ํน์ ๋ถ๋ฅ๋ก ๋๋๊ธฐ ๋๋ฌธ์ ์ผ์ข ์ ๋ถ๋ฅ (classification) ๊ธฐ๋ฒ์ผ๋ก๋ ๋ณผ ์ ์๋ค.
ex) ์ ์๊ฐ ์๋๋ผ ํฉ๊ฒฉ ๋ถํฉ๊ฒฉ๋ง ๋ฐํ๋๋ ์ํ
๊ณต๋ถํ ์๊ฐ | 2 | 4 | 6 | 8 | 10 | 12 | 14 |
์ํ ๊ฒฐ๊ณผ | ๋ถํฉ | ๋ถํฉ | ๋ถํฉ | ํฉ๊ฒฉ | ํฉ๊ฒฉ | ํฉ๊ฒฉ | ํฉ๊ฒฉ |
๊ณต๋ถํ ์๊ฐ์ ๋ฐ๋ฅธ ํฉ๊ฒฉ ์ฌ๋ถ
ํฉ๊ฒฉ์ 1 ๋ถํฉ์ 0์ด๋ผ๊ณ ํ๊ณ ์ขํ ํ๋ฉด์ ๋ํ๋ด๋ฉด ์ง์ ์ ์ผ์ฐจ๋ฐฉ์ ์์ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
์ ๋ค์ ํน์ฑ์ ๋ด์๋ด๋ ค๋ฉด ์ฐธ(1)๊ณผ ๊ฑฐ์ง(0)์ ๊ตฌ๋ถํ๋ Sํํ์ ์ ์ ๊ธ๋๊ฒ ์ ์ ํ๋ค - ์๊ทธ๋ชจ์ด๋ ํจ์
y๊ฐ์ด 0๊ณผ 1 ์ฌ์ด
์๊ทธ๋ชจ์ด๋ ํจ์๋ก ๋ก์ง์คํฑ ํ๊ท ํธ๋ ๊ณต์ :
a = ๊ทธ๋ํ์ ๊ฒฝ์ฌ๋
a๊ฐ ์ปค์ง๋ฉด ๊ฒฝ์ฌ๋ ์ปค์ง๋ค. b๋ ๊ทธ๋ํ์ ์ข์ฐ์ด๋์ ์๋ฏธ
a์ b ๊ฐ์ ๋ฐ๋ผ ์ค์ฐจ๋ ๋ณํํ๋ค.
- a๊ฐ์ด ์์์ง๋ฉด(0์ ๊ฐ๊น์์ง๋ฉด) ์ค์ฐจ๋ ๋ฌดํ๋๋ก ์ปค์ง์ง๋ง, a๊ฐ ์ปค์ง๋ค๊ณ ํด์ ์ค์ฐจ๊ฐ ์์ด์ง์ง๋ ์๋๋ค.
- b๊ฐ์ด ๋๋ฌด ์๊ฑฐ๋ ํฌ๋ฉด ์ค์ฐจ๋ ์ด์ ๋ฐ๋ผ ์ปค์ง๋ค.
์๊ทธ๋ชจ์ด๋ ํจ์์์ a์ b์ ๊ฐ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ํตํด ๊ตฌํ๋ค
๊ฒฝ์ฌํ๊ฐ๋ฒ = ๋จผ์ ์ค์ฐจ๋ฅผ ๊ตฌํ ๋ค์ ์ค์ฐจ๊ฐ ์์ ์ชฝ์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ
๋จผ์ , ์ค์ฐจ ๊ตฌํ๋ ๊ณต์ ํ์
์๊ทธ๋ชจ์ด๋ ํจ์์ ์ค์ฐจ๊ฐ ์ปค์ง๋ ๊ฒฝ์ฐ : ๋ฅผ ๊ณต์์ผ๋ก ๋ง๋๋ ํจ์ = ๋ก๊ทธ ํจ์
- ์ค์ ๊ฐ์ด 1์ผ ๋ ์์ธก ๊ฐ์ด 0์ ๊ฐ๊น์ - ์ผ์ชฝ๊ทธ๋ํ ์ฐ๊ธฐ
- ์ค์ ๊ฐ์ด 0์ผ ๋ ์์ธก ๊ฐ์ด 1์ ๊ฐ๊น์ - ์ค๋ฅธ์ชฝ๊ทธ๋ํ ์ฐ๊ธฐ
์ค์ฐจํจ์
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#x,y๋ฆฌ์คํธ
data=[[2,0],[4,0],[6,0],[8,1],[10,1],[12,1],[14,1]]
xdata= [i[0] for i in data]
ydata= [i[1] for i in data]
plt.scatter(xdata, ydata)
plt.xlim(0,15)
plt.ylim(-.1,1.1)
#์ด๊ธฐํ
a=0
b=0
#ํ์ต๋ฅ ์ ํ๊ธฐ
lr=0.05
#์๊ทธ๋ชจ์ด๋ ํจ์ ์ ์
def sigmoid(x):
return 1 / (1+np.e ** (-x)
#๊ฒฝ์ฌํ๊ฐ๋ฒ
for i in range(2001):
for x_data, y_data in data:
# a์ ๊ดํ ํธ๋ฏธ๋ถ. ์์ ์ ์ํ sigmoid ํจ์ ์ฌ์ฉ
a_diff = x_data*(sigmoid(a*x_data + b) - y_data)
# b์ ๊ดํ ํธ๋ฏธ๋ถ
b_diff = sigmoid(a*x_data + b) - y_data
# a๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด a - diff์ ํ์ต๋ฅ lr์ ๊ณฑํ ๊ฐ์ a์์ ๋บ
a = a - lr * a_diff
# b๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด b - diff์ ํ์ต๋ฅ lr์ ๊ณฑํ ๊ฐ์ b์์ ๋บ
b = b - lr * b_diff
if i % 1000 = = 0:
print("epoch=%.f, ๊ธฐ์ธ๊ธฐ=%.04f, ์ ํธ=%.04f" % (i, a, b))
# ์์ ๊ตฌํ ๊ธฐ์ธ๊ธฐ์ ์ ํธ์ ์ด์ฉํด ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.scatter(x, y)
plt.xlim(0, 15)
plt.ylim(-.1, 1.1)
x_range = (np.arange(0, 15, 0.1)) # ๊ทธ๋ํ๋ก ๋ํ๋ผ x ๊ฐ์ ๋ฒ์ ์ ํ๊ธฐ
plt.plot(np.arange(0, 15, 0.1), np.array([sigmoid(a * x + b) for x in x_range]))
plt.show()
์ธ ๊ฐ ์ด์์ ์ ๋ ฅ ๊ฐ ๋ค๋ฃฌ๋ค๋ฉด ์๊ทธ๋ชจ์ด๋ ๋์ ์ํํธ๋งฅ์ค ํจ์ ์ฌ์ฉ - ๋ค์ค ๋ถ๋ฅ
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] ํผ์ ํธ๋ก (perceptron) - ๋ค์ธต ํผ์ ํธ๋ก (0) | 2021.03.19 |
---|---|
[๋ฅ๋ฌ๋] ํผ์ ํธ๋ก (perceptron) - ๋จ์ธต ํผ์ ํธ๋ก (0) | 2021.03.18 |
[๋ฅ๋ฌ๋] ๋ค์ค ์ ํ ํ๊ท (Multiple linear regression) (0) | 2021.03.16 |
[๋ฅ๋ฌ๋] ๊ฒฝ์ฌํ๊ฐ๋ฒ(Gradient Descent) (0) | 2021.03.15 |
[๋ฅ๋ฌ๋] ์ค์ฐจ ํ๊ฐ๋ฒ : ํ๊ท ์ ๊ณฑ์ค์ฐจ Mean Squared Error (0) | 2021.03.15 |