[PyTorch] Linear Regression Practice
Linear Regression Practice
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
댓글남기기