x = [1.0, 2.0, 3.0]
y = [2.0, 2.0, 5.0]
xbar, ybar = sum(x)/len(x), sum(y)/len(y)
sxx = sum((v-xbar)**2 for v in x)
if sxx == 0:
    raise ValueError('x must vary for a unique slope')
a = sum((u-xbar)*(v-ybar) for u, v in zip(x, y))/sxx
b = ybar-a*xbar
pred = [a*u+b for u in x]
sse = sum((v-z)**2 for v, z in zip(y, pred))
print('slope/intercept', round(a, 6), round(b, 6))
print('predictions', pred)
print('SSE/MSE', sse, sse/len(x))
assert abs(a-1.5) < 1e-12 and abs(b) < 1e-12
assert abs(sse-1.5) < 1e-12
