import numpy as np
x_data = np.array([1, 2, 3, 4, 5]).reshape(5, 1)
t_data = np.array([2, 3, 4, 5, 6]).reshape(5, 1)
W = np.random.rand(x_data.shape[1], 1)
b = np.random.rand(1)
print("W ==", W, ", b ==", b)
def CostFunc(input_data, answer):
y = np.dot(input_data, W) + b
e = y - answer
eT = e.T
n = len(answer)
loss = np.dot(e.T, e) / n
return loss
def numerical_partial_derivative(f, x):
delta = 1e-4
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
initialx = x[idx]
x[idx] = initialx + delta
f1 = f(x)
x[idx] = initialx - delta
f2 = f(x)
grad[idx] = (f1 - f2)/(2*delta)
x[idx] = initialx
it.iternext()
return grad
f = lambda x : CostFunc(x_data, t_data) ###################################################
print("Initial error value = ", CostFunc(x_data, t_data),
"Initial W = ", W, "\n", ", b = ", b )
WNPD = numerical_partial_derivative(f, W) ################################################
bNPD = numerical_partial_derivative(f, b) #################################################
alpha = 1e-2
for step in range(8001):
for i in range(len(W)):
W[i] = W[i] - alpha*WNPD[i]
for i in range(len(b)):
b[i] = b[i] - alpha*bNPD[i]
WNPD = numerical_partial_derivative(f, W)
bNPD = numerical_partial_derivative(f, b)
if (step % 400 == 0):
print("step ==", step, ", W ==", W, ", b ==", b,
", error ==", CostFunc(x_data, t_data))
def predict(input_data):
y = np.dot(input_data, W) + b
return y
print("predict ==", predict(44))
간단한 선형 회귀를 구현한 코드입니다.
아시다싶이, 선형 회귀에선 수치 미분을 이용해야하는데요 제가 수강 중인 강의에선 이 수치 미분에 대입할 함수를 lambda를 이용해서 정의를 하더라구요. #### 부분
f = lambda x : CostFunc(x_data, t_data)
인데... 표현식에 x에 대한게 없으니까 f(x) = invariant, for any x 아닌가요?
그런데
WNPD = numerical_partial_derivative(f, W)
bNPD = numerical_partial_derivative(f, b)
에선 어떻게 W와 b에 대한 수치 미분을 할 수 있는 것인지...
람다에 대한 이해가 부족한 것 같은데 알려주실 고수분 있으신가요? (글이 두서없는 점 죄송합니다...)