\ k
ZZR ,python中文社区专栏作者,OpenStack工程师,曾经的NLP研究者。主要兴趣方向:OpenStack、Python爬虫、Python数据分析。
Blog: http://skydream.me/
CSDN: http://blog.csdn.net/titan0427/article/details/50365480
―
―
1. 背景文章的背景取自 An Introduction to Gradient Descent and Linear Regression ,本文想在该文章的基础上,完整地描述线性回归算法。部分数据和图片取自该文章。没有太多时间抠细节,所以难免有什么缺漏错误之处,望指正。
线性回归的目标很简单,就是用一条线,来拟合这些点,并且使得点集与拟合函数间的误差最小。如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。数据来自于 GradientDescentExample 中的data.csv文件,共100个数据点,如下图所示:

我们的目标是用一条直线来拟合这些点。既然是二维,那 么y = b + m x 这个公式相信对于中国学生都很熟悉。其中 b 是直线在y轴的截距(y-intercept), m 是直线的斜率(slope)。寻找最佳拟合直线的过程,其实就是寻找最佳的 b 和 m 的过程。为了寻找最佳的拟合直线,这里首先要定义,什么样的直线才是最佳的直线。我们定义误差(cost function):
误 差 函 数E r r o r ( b , m ) = 1 N ∑ 1 N ( ( b + m x i ) y i ) 2
计算损失函数的python代码如下:
# y = b + mx def compute_error_for_line_given_points(b, m, points): totalError = sum((((b + m * point[0]) - point[1]) ** 2 for point in points)) return totalError / float(len(points))现在问题被转化为,寻找参数 b 和 m ,使得误差函数 E r r o r ( b , m ) 有最小值。在这里, x i 和 y i 都被视为已知值。从下图看,最小二乘法所做的是通过数学推导直接计算得到最低点;而梯度下降法所做的是从图中的任意一点开始,逐步找到图的最低点。
2. 多元线性回归模型从机器学习的角度来说,以上的数据只有一个feature,所以用一元线性回归模型即可。这里我们将一元线性模型的结论一般化,即推广到多元线性回归模型。这部分内部参考了 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent) 。假设有 x 1 , x 2 , … , x n 共 n 个feature, θ 为 x 的系数,则
拟 合 函 数h θ ( x ) = θ 0 + θ 1 x 1 + . . . + θ n x n = θ T x , 其 中 x 0 = 1
误 差 函 数 J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 ,