np.random.seed(0)
max_degree = 20 # highest polynomial degree we will fit
n_train, n_test = 20, 100 # few training points, so high degrees overfit
true_w = np.zeros(max_degree)
true_w[:4] = np.array([5, 1.2, -3.4, 5.6])
x = np.random.uniform(-1, 1, size=n_train + n_test)
poly = np.power(x.reshape(-1, 1), np.arange(max_degree)) # column i holds x**i
labels = poly @ true_w + np.random.normal(scale=0.1, size=n_train + n_test)