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에 대한 수치 미분을 할 수 있는 것인지...

람다에 대한 이해가 부족한 것 같은데 알려주실 고수분 있으신가요? (글이 두서없는 점 죄송합니다...)