%matplotlib inline import numpy as np import matplotlib.pyplot as plt xs = np.linspace(0.0, 3.0, 31) ys = np.sin(xs) + np.random.normal(0.0, 0.1, len(xs)) xp = np.linspace(-0.1, 3.1, 100) plt.plot(xs,ys,"o", xp, np.sin(xp), "-") plt.ylim(-0.2, 1.5) xp = np.linspace(-0.1, 3.1, 1000) plt.plot(xs,ys, "o", xp, np.poly1d(np.polyfit(xs,ys,1))(xp), "-", xp, np.poly1d(np.polyfit(xs,ys,2))(xp), "--") plt.ylim(-0.2, 1.2) plt.plot(xs,ys, "o", xp, np.poly1d(np.polyfit(xs,ys,30))(xp), "-") plt.xlim(-0.2, 3.1) plt.ylim(-1, 2) def fit(i): return np.poly1d(np.polyfit(xs,ys,i)) def s2(i): return ((ys - fit(i)(xs))**2).sum()/len(xs) degs = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) plt.plot(degs, np.vectorize(s2)(degs)) plt.yscale('log') def aic(i): return len(xs)*np.log(s2(i))+2*(i+1) aics = np.vectorize(aic)(degs) plt.plot(degs, aics) X2 = np.polynomial.polynomial.polyvander(xs, 2) from sklearn.linear_model import LinearRegression lr = LinearRegression(normalize=True) lr.fit(X2, ys) predicted = lr.predict(X2) plt.plot(xs, ys, "o", xs, predicted, "-")