线性回归:最小二乘曲线拟合算法(Python代码)

最小二乘是最简单的线型回归分析方法,它通过最小化误差的平方和寻找能最好的拟合数据的一条直线。误差有两种不同的计算方式:垂直(perpendicular)和竖直(vertical):

least_squares_perpendicular

least_squares_vertical

事实上用垂直误差计算出的直线更精确,但是处理起来也更复杂。在这里用竖直误差拟合直线。

我们的目标是用线性方程 f(x) = acdot x + b 计算出最拟合 n 个点 (x_i, y_i), i=1,2,...n 的线型方程。
把以上问题改写为矩阵形式 pmb X ; pmb a = pmb y

Screen Shot 2015-11-30 at 12.17.49 PM

  • 经过计算,得出参数向量 pmb a = [a;b]^T

Rightarrow pmb a = (pmb X^T ; pmb X)^{-1} pmb X^T ; pmb y

  • 获得斜率a,y轴的截距b

a = frac{S_{x,y}}{sigma_{x}^{2}}quad   斜率
b = bar{y} - abar{x}quad                          截距

S_{xy} = sum_{i=1}^{n} (x_i - bar{x})(y_i - bar{y})quad
sigma{_x}^{2} = sum_{i=1}^{n} (x_i - bar{x})^2quad

最小二乘拟合代码实现(两种方法)

  • 首先,我们用python 的NumPy矩阵实现如下方程:

  $pmb a = (pmb X^T ; pmb X)^{-1} pmb X^T ; pmb y$

 

  • 上面代码使用NumPy的矩阵实现,下载用经典Python实现如下方程:

  $a = frac{S_{x,y}}{sigma_{x}^{2}}quad$ $b = bar{y} - abar{x}quad$

可视化

用matplotlib绘制最小二乘拟合的大致样子:

如果用的是python 2需要在文件头加入 from __future__ import division。

Screen Shot 2015-11-30 at 12.42.35 PM

两种算法的效率比较

目的:随着样本数量的增加,这两种算法的优劣。

系统信息:

Screen Shot 2015-11-30 at 1.00.27 PM

绘制随样本增长,每个算法花费时间的图像:

Screen Shot 2015-11-30 at 1.05.22 PM

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注