Linear Regression Practice

  • 소스코드들은 링크에서 확인이 가능하십니다.

  • KAIST의 딥러닝 홀로서기 강좌를 참조하였습니다.링크

X = list(range(10))
Y = list(range(10))
class H():
  def __init__(self, w):
    self.w = w

  def forward(self, x):
    return self.w * x

def cost(h, X, Y):
  error = 0
  for i in range(len(X)):
    error += (h.forward(X[i]) - Y[i]) ** 2
    # print(error)
  error = error / len(X)
  return error

h = H(4)
cost(h, X, Y)
256.5

w 값이 바뀌는지에 따라서, 정말 바뀌는가..

확인해 보자

for i in range(100):
  w = i * 0.1
  h = H(w)
  print(cost(h, X, Y))
  
28.5
23.085
18.240000000000002
13.964999999999998
10.26
7.125
4.559999999999998
2.5649999999999986
1.1399999999999995
0.285
0.0
0.2850000000000004
1.140000000000002
2.565000000000001
4.560000000000003
7.125
10.260000000000002
13.965000000000007
18.24
23.085000000000008
28.5
34.48500000000001
41.040000000000006
48.16500000000002
55.86000000000003
64.125
72.96000000000001
82.36500000000002
92.34000000000003
102.88500000000003
114.0
125.68500000000002
137.94
150.76500000000004
164.16000000000003
178.125
192.66000000000003
207.76500000000004
223.44000000000005
239.68500000000003
256.5
273.8850000000001
291.84000000000003
310.3649999999999
329.46000000000004
349.125
369.3600000000001
390.1650000000001
411.54000000000013
433.485
456.0
479.08500000000015
502.74000000000007
526.9650000000003
551.76
577.125
603.0600000000002
629.5650000000002
656.6400000000001
684.2850000000001
712.5
741.2850000000001
770.6400000000001
800.5650000000002
831.0600000000002
862.125
893.7600000000002
925.9650000000001
958.7400000000001
992.085
1026.0
1060.4850000000001
1095.54
1131.1650000000004
1167.3600000000001
1204.125
1241.46
1279.365
1317.8400000000001
1356.8850000000002
1396.5
1436.685
1477.4400000000005
1518.765
1560.6600000000003
1603.125
1646.1599999999999
1689.7650000000006
1733.94
1778.6850000000002
1824.0
1869.8849999999998
1916.3400000000006
1963.3650000000002
2010.9600000000003
2059.125
2107.860000000001
2157.1650000000004
2207.04
2257.485

시각적으로 보여주기 위해서, 변화하는 값들을 담을 리스트와 plt package를 import 해줍니다.

import matplotlib.pyplot as plt          # graph를 그려주게 해줍니다.@@

list_w = list()
list_c = list()
for i in range(100):
  w = i * 0.1
  h = H(w)
  c = cost(h, X, Y)
  list_w.append(w)
  list_c.append(c)

plt.figure(figsize=(5,5))
plt.plot(list_w, list_c)
## 주의할점은 순서가 중요하다!!!
## plot는 이미 graph로 그리기 전에, 사이즈 설정을 해주어야 한다.
## 그래서 plt.plot(x,y) 전에 plt.figure()가 먼저 실행되어야 한다.
plt.xlabel("w", fontsize=20)
plt.ylabel("cost", fontsize=20)
plt.scatter(list_w, list_c, s=5)
plt.show()

  

W 값이 음수인 경우도 그려보자!!!

list_w = list()
list_c = list()
for i in range(-100, 100):
  w = i * 0.1
  h = H(w)
  c = cost(h, X, Y)
  list_w.append(w)
  list_c.append(c)

plt.figure(figsize=(5,5))
plt.plot(list_w, list_c)
## 주의할점은 순서가 중요하다!!!
## plot는 이미 graph로 그리기 전에, 사이즈 설정을 해주어야 한다.
## 그래서 plt.plot(x,y) 전에 plt.figure()가 먼저 실행되어야 한다.
plt.xlabel("w", fontsize=20)
plt.ylabel("cost", fontsize=20)
plt.scatter(list_w, list_c, s=5)
plt.show()

  

gradient를 수치해석으로 구해봅시다@@

def grad(w, cost):
  h = H(w)
  cost1 = cost(h, X, Y)
  eps = 0.001
  h = H(w + eps)
  cost2 = cost(h, X, Y)
  dcost = cost2 - cost1
  dw = eps
  grad = dcost / dw
  return grad

# w = 4
# lr = 0.001
# print(grad(4, cost))
# w = w + lr * (-grad())
# print(w)

grad(4, cost)
171.028500000034

이게 무슨말인가??

w 값이 4인 지점에서는 w가 증가한다면, cost도 증가한다는 뜻이다!!

cost를 낮추려면, w를 낮추어야 한다@@

그래서 (-)를 취해서 w가 낮아지는것 까지 확인할 수 있습니다.

(위의 코드블록에서 주석을 해제하시면 확인하실수있습니다!!)

직관적으로 보실분들을 위해서 아래의 코드를 준비했습니다.

w = 4
lr = 0.001
for i in range(20):
  w -= lr * grad(w, cost)
  print(w)
3.828971499999966
3.667691624500037
3.515604701903527
3.3721867338950346
3.236943590063021
3.109409305429466
2.989144475019984
2.8757347399438515
2.768789359767055
2.6679398662603404
2.5728387938835198
2.483158482632163
2.3985899491221403
2.318841822022179
2.243639338166915
2.17272339589141
2.1058496623256033
2.04278773157305
1.98332033087339
1.9272425720136077

지금까지의 중간점검(사실 해보시면 아시겠지만, Linear Regression 별거 없습니다.자만인가..??)

1.Hypothesis Define (Model Define)

  • class h() 정의를 말하고 있습니다!

2.1번에서 정의한 Model의 평가를 위해서, Cost func.를 정의했습니다.

  • def cost(h,X,Y)가 해당됩니다.

  • 저는 Mean Square Error(MSE)로 정의했습니다.

그렇다면 cost를 줄이기위한 방법도 있어야하지 않을까요?

학습이라는게 어떤 오차를 확인하는 용도가 아닌, 수정하는게 더 큰 의미가 있지 않을까 합니다.

그리하여

3.gradient 정의.(저희는 수치해석적으로 정의를 했습니다. 아마 나중에는 pytorch에서 제공해주는거 쓰게될것같습니다.)

  • def grad(w, cost)가 해당됩니다.

  • cost를 줄이기 위해서는 gradient의 반대방향으로 parameter를 조정해주어야 합니다.

그러면 이제 확인할게 무엇일까요??

cost(오차)가 줄어드냐??

아래에서 확인해 보시죠.

def cal_grad(w, cost):
  h = H(w)
  cost1 = cost(h, X, Y)
  eps = 0.001
  h = H(w + eps)
  cost2 = cost(h, X, Y)
  dcost = cost2 - cost1
  dw = eps
  grad = dcost / dw
  return grad, (cost1+cost2)*0.5

w = 4
lr = 0.001
for i in range(20):
  grad, mean_cost = cal_grad(w, cost)
  w -= lr * grad
  print(w, mean_cost)
3.828971499999966 256.58551425
3.667691624500037 228.16841275039363
3.515604701903527 202.8985336589862
3.3721867338950346 180.42731894681953
3.236943590063021 160.44481373524235
3.109409305429466 142.6753909583518
2.989144475019984 126.87394952342876
2.8757347399438515 112.8225335288601
2.768789359767055 100.32732590710691
2.6679398662603404 89.21597502467012
2.5728387938835198 79.33521736381444
2.483158482632163 70.54876349465718
2.3985899491221403 62.73541817796161
2.318841822022179 55.787408668435894
2.243639338166915 49.608898160098896
2.17272339589141 44.114663869070654
2.1058496623256033 39.2289215200087
2.04278773157305 34.88428002184733
1.98332033087339 31.020811914248938
1.9272425720136077 27.58522676303506


댓글남기기