"""Four-fold cross-validation starter."""
import numpy as np
x=np.array([-3.,-2.,-1.,0.,1.,2.,3.,4.])
y=np.array([9.2,3.9,1.1,0.2,0.9,4.1,8.8,16.2])
rng=np.random.default_rng(0); folds=np.array_split(rng.permutation(len(x)),4)
def design(x,d): return np.column_stack([x**j for j in range(d+1)])
for d in [1,2,3]:
    errors=[]
    for k in range(4):
        va=folds[k]; tr=np.concatenate([folds[j] for j in range(4) if j!=k])
        w,*_=np.linalg.lstsq(design(x[tr],d),y[tr],rcond=None)
        errors.extend((design(x[va],d)@w-y[va])**2)
    print(d,np.mean(errors))
# TODO: choose the degree with the smallest pooled CV MSE.
