def validate(M, lam): X_train, Y_train = regressTrainData() X_validate, Y_validate = regressValidateData() phi_train = phi(X_train, M) w = w_ml(phi_train, Y_train, lam, M) phi_validate = phi(X_validate, M) Y_approx = np.dot(phi_validate, w) sse = np.linalg.norm(Y_validate - Y_approx) return sse
def find_lam(X_train, Y_train, M, lam0, e, a): X_val_pre, Y_val_pre = regressValidateData() X_val = np.array(X_val_pre)[:, 0] Y_val = np.array(Y_val_pre)[:, 0] dx = 0.01 while True: w_plus = w_ml(X_train, Y_train, lam0 + dx, M) w_minus = w_ml(X_train, Y_train, lam0 - dx, M) lam1 = lam0 - a * (sse(X_val, Y_val, w_plus, M) - sse(X_val, Y_val, w_minus, M)) / (2 * dx) if abs(lam1 - lam0) < e: break else: lam0 = lam1 w = w_ml(X_train, Y_train, lam1, M) ss = sse(X_val, Y_val, w, M) return lam1, w, ss
results = {} for m in M: lam, w, ss = find_lam(X_train, Y_train, m, 0.5, 0.01, 0.1) print m, lam, ss results[m] = {'w': w, 'lam': lam, 'sse': ss} for key, value in results.iteritems(): print "{}: {}".format(key, value) """ M = 2 w = [1.12338195, 0.83457492] X_train, Y_train = regressTrainData() X_test, Y_test = regressTestData() X_val, Y_val = regressValidateData() pts = [p for p in np.linspace(min(X_test), max(X_test), 100)] plt.plot(X_test.T.tolist()[0], Y_test.T.tolist()[0], 'gs') y_test_approx = [] for pt in pts: s = 0 for k in range(M): s += w[k] * (pt ** k) y_test_approx.append(s) plt.plot(pts, y_test_approx) plt.title('Test dataset') plt.show()