最小二乘法拟合
相关系数度量变量关系的强弱和正负,但并不关注关系的斜率。估计斜率最常用的是线性最小二乘法拟合(linear least squares fit),“线性拟合”是用一条线对变量关系进行建模,“最小二乘法”拟合实现线与数据之间的均方差最小。
假设我们要将一个点序列ys表示成另一个序列xs的函数。如果xs和ys之间存在线性关系,截距为inter,斜率为slope,那么我们就可以预期每个y[i]值为inter + slope * x[i]。
除非完全相关,否则我们的预测只能是近似的,实际数据到拟合线的竖直偏移或残差(residual)为:
res = ys - (inter + slope * xs)
残差可能由随机因素导致,如测量误差,也可能由未知的非随机因素导致。如果参数inter和slope的估计错误,那么残差就会变大,我们希望选择的参数能使残差最小。最常见的的做法是使残差平方和sum(res**2)最小,这么选择的理由是:
-
平方值和残差的正负没有关系
-
平方值使较大的残差具有更多的权重,但不至于使最大的残差作用过大
-
如果残差不相关,符合均值为0且方差为常数(但未知)的正态分布,那么最小二乘法拟合也是inter和slope的最大似然估计量(参见https://en.wikipedia.org/wiki/Linear_regression)
实现
最小二乘法的简单实现如下:
def LeastSquares(xs, ys):
meanx, varx = MeanVar(xs)
meany = Mean(ys)
slope = Cov(xs, ys, meanx, meany) / varx
inter = meany - slope * meanx
return inter, slope
def FitLine(xs, inter, slope):
fit_xs = np.sort(xs)
fit_ys = inter + slope * fit_xs
return fit_xs, fit_ys