EunGyeongKim

지도학습 : 회귀_1차원 모델(선형기저함수_최적화) (3) 본문

ML & DL/딥러닝

지도학습 : 회귀_1차원 모델(선형기저함수_최적화) (3)

EunGyeongKim 2023. 6. 8. 20:43

선형기저 함수 모델을 도입하여 오차를 많이 떨어뜨림. 하지만, 30세 이후로는 키가 수렴하지 않음.

그 이유는 30세 주위에 데이터가 충분하지 않았기 때문

 

그러므로 이에 해당하는 모델을 만들면 됨. x 가 증가함에 따라 키가 점차 증가하고, 결국에는 일정한 값으로 수렴하는 함수를 만들면 됨.

$$y(x) = w_0 - w_1 exp(-w_2x)$$

w0, w1, w2는 모두 양의값을 취하는 매개변수. x가 증가하면 y는 w0에 가까워짐. w0은 수렴하는 값을 결정하는 매개변수. w는 그래프의 시작점을 정하는 매개변수, w2 그래프 기울기를 결정하는 매개변수

지금까지 해오던 방법과 동일하게 J값이 최소가 되도록 w0, w1, w2를 구함. 

$$J = \frac{1}{N}\sum^{N-1}_{n=0}(y_n - t_n)^2$$

이번에는 '수치해석'라이브러리 사용하여 찾아봄.

scipy.optimize에 포함된 minimize함수를 사용하여 최적 매개변수 구해보기

 

plot이 잘못되어서 생기는 문제였다. 코드 수정 후 문제해결! ㅎㅎ


# find parameter using scipy 
def model(x, w):
    y = w[0] - w[1] * np.exp(-w[2]*x)
    return y

def show_model(w):
    xb = np.linspace(x_min, x_max, 100)
    y = model(xb, w)
    plt.plot(xb, y, c =[.5, .5, .5], lw = 4)

def mse_model(w, x, t):
    y = model(x, w)
    mse = np.mean((y-t)**2)
    return mse

from scipy.optimize import minimize
def fit_model(w_init, x, t):
    res1 = minimize(mse_model, w_init, args=(x, t), method = 'powell')
    return res1.x

# main
plt.figure(figsize=(4,4))
w_init= [100, 0, 0]
w = fit_model(w_init, x, t)

print("w0={0:.3f}, w1={1:.3f}, w2={2:.3f}".format(w[0], w[1], w[2]))
show_model(w)

plt.plot(x, t, marker = 'o', linestyle='None', color='cornflowerblue', markeredgecolor='black')
plt.xlim(x_min, x_max)
plt.grid(True)
mse = mse_model(w, x, t)
plt.title("SD={0:.1f}cm".format(np.sqrt(mse)))
plt.show()

 

Comments