线性回归之梯度下降算法

线性回归之梯度下降法

1.梯度的概念

梯度是一个向量,对于一个多元函数\(f\)而言,\(f\)在点\(P(x,y)\)的梯度是\(f\)在点\(P\)处增大最快的方向,即以f在P上的偏导数为分量的向量。以二元函数\(f(x,y)\)为例,向量\(\{\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\}|_{(x_0,y_0)}=f_x(x_0,y_0)\overrightarrow i+f_y(x_0,y_0)\overrightarrow j\)就是函数\(f(x,y)\)在点\(P(x_0,y_0)\)处的梯度,记作\(gradf(x,y)\)或者\(\nabla f(x,y)\)。

2.梯度下降法

对于梯度下降,我们可以形象地理解为一个人下山的过程。假设现在有一个人在山上,现在他想要走下山,但是他不知道山底在哪个方向,怎么办呢?显然我们可以想到的是,一定要沿着山高度下降的地方走,不然就不是下山而是上山了。山高度下降的方向有很多,选哪个方向呢?这个人比较有冒险精神,他选择最陡峭的方向,即山高度下降最快的方向。现在确定了方向,就要开始下山了。又有一个问题来了,在下山的过程中,最开始选定的方向并不总是高度下降最快的地方。这个人比较聪明,他每次都选定一段距离,每走一段距离之后,就重新确定当前所在位置的高度下降最快的地方。这样,这个人每次下山的方向都可以近似看作是每个距离段内高度下降最快的地方。现在我们将这个思想引入线性回归,在线性回归中,我们要找到参数矩阵\(\theta\)使得损失函数\(J(\theta)\)最小。如果把损失函数\(J(\theta)\)看作是这座山,山底不就是损失函数最小的地方吗,那我们求解参数矩阵\(\theta\)的过程,就是人走到山底的过程。

如图所示,这是一元线性回归(即假设函数\(h_\theta(x) = \theta_0+\theta_1x\))中的损失函数图像,一开始我们选定一个起始点(通常是\((\theta_0=0,\theta_1=0)\)),然后沿着这个起始点开始,沿着这一点处损失函数下降最快的方向(即该点的梯度负方向)走一小步,走完一步之后,到达第二个点,然后我们又沿着第二个点的梯度负方向走一小步,到达第三个点,以此类推,直到我们到底局部最低点。为什么是局部最低点呢?因为我们到达的这个点的梯度为0向量(通常是和0向量相差在某一个可接受的范围内),这说明这个点是损失函数的极小值点,并不一定是最小值点。

从梯度下降法的思想,我们可以看到,最后得到的局部最低点与我们选定的起始点有关。通常情况下,如果起始点不同,最后得到的局部最低点也会不一样。

3.梯度下降算法描述

现在对于梯度下降法,有了一个直观形象的理解了。接下来,我们看一下梯度下降算法。首先,我们给在下山的例子中每一段路的距离取名叫学习率(Learning Rate,也称步长,用\(\alpha\)表示),把一次下山走一段距离叫做一次迭代。算法详细过程:

  1. 确定定参数的初始值,计算损失函数的偏导数
  2. 将参数代入偏导数计算出梯度。若梯度为0,结束;否则转到3
  3. 用步长乘以梯度,并对参数进行更新
  4. 重复2-3

对于多元线性回归来说,拟合函数为:

\[h_\theta(x) = \sum_\limits{i=0}^n\theta_ix_i =\theta_0+ \theta_1x_1 + \cdots+\theta_nx_n \tag{3.1}\]

损失函数为:

\[J(\theta)=\frac{1}{2m}\sum_\limits{i=0}^m(y^{(i)}-h_\theta(x^{(i)}))^2 \tag{3.2}\]

损失函数的偏导数为:

\[\frac{\partial J(\theta)}{\theta_i} = \frac{1}{m}\sum_\limits{j=1}^m(h_\theta(x^{(j)})-y^{(j)})x_i^{(j)}=\frac{1}{m}\sum_\limits{j=1}^m(\sum_\limits{i=0}^n\theta_ix_i^{(j)}-y^{(j)})x_i^{(j)}\quad (i=0,1,\dots,n) \tag{3.3}\]

每次更新参数的操作为:

\[\theta_i = \theta_i-\alpha\frac{\partial J(\theta)}{\theta_i} = \theta_i-\alpha\frac{1}{m}\sum_\limits{j=1}^m(h_\theta(x^{(j)})-y^{(j)})x_i^{(j)}\quad (i=0,1,\dots,n)\tag{3.4}\]

注意,更新参数时必须同步更新所有参数,不能先更新\(\theta_0\)再更新\(\theta_1\),如果用Java伪代码就是:

double []temp = new double[n+1]; //因为参数??从??0到????,所以一共n+1,temp数组表示每次下降的高度
for(int i = 0; i < temp.length();i++){
  double sum = 0;
  for(int j = 0; j < m; j++){
    double hx = 0;
    for(int k = 0; k <= n; k++){
        hx += theta[k]*x[j][k];
    }
    sum += (hx - y[j])*x[j][i];
  }
  temp[i] = alpha/m*sum;
}
for(int i = 0; i < n; i++)
  theta[i] = theta[i] -temp[i];

对于这种需要同步更新的,最好的方法是采用矩阵运算,Java代码是(采用commons-math3库):

theta = (theta.substract(alpha/m*(X.transpose().multiply(X.multiply(theta)-y))).copy;
//theta为(n+1)*1维,X为m*(n+1)维,y为m*1维

数学推导如下:

\[h_\theta(x) = \theta^Tx,J(\theta) = \frac{1}{2m}(X\theta-Y)^T(X\theta-Y),\frac{\partial J(\theta)}{\partial\theta}=\frac{1}{m}X^T(X\theta-Y),\theta = \theta - \alpha\frac{1}{m} X^T(X\theta-Y)\]

其中\(\theta\)为(n+1)*1维,\(X\)为m*(n+1)维,\(Y\)为m*1维,\(x\)为(n+1)*1维

4.特征缩放

在梯度下降中,如果样本的某些维度取值范围并不合理,比如房价预测系统中将房价的单位采用万亿元/平方米,这样每一个样本值的房价会非常小,以至于在图形表示时,几乎是一条水平线,不同的拟合直线所计算出的损失函数之间的差值非常小。这样采用直线取进行拟合时,如果我们在梯度下降法中循环结束的标志是梯度值为0,理论上这样我们仍然可以计算出准确的参数值。但是通常情况下,我们采用的标志是梯度与0相差在某一个可接受的范围内,如果我们选定这个范围是0.0001,0.0001乘以万亿,其结果是一亿,这么大的误差显然是不能接受的。所以,我们有必要进行特征缩放,通常采用标准化的方式来进行特征缩放,即\(x_i = \frac{x_i-\overline x_i}{\sigma_i}\)。特征缩放之后,还可以加快我们的收敛速度。

5.其他梯度下降算法

在上文中,我们介绍了梯度下降法的思想和算法步骤,并给出了数学证明。实际上,文中介绍的是批量梯度下降法(Batch Gradient Descent, BSD)。梯度下降法,还有随机梯度下降法(Stochastic Gradient Descent, SGD)和小批量梯度下降法(Mini-batch Gradient Descent, MBSD)。它们之间的区别仅在于更新参数\(\theta\)的方式不同,即采用全体样本、随机样本或部分样本。

6.学习率的选择

在梯度下降算法中,迭代步长(即学习率)的选择非常重要。如果步长太大,最后可能不收敛,即出现振荡。如果步长太小,那么收敛速度太慢,我们需要很多次迭代来到达局部最优解。下图是对于某一房价预测系统,选择不同学习率时,损失函数随迭代次数的变化:

可以看到在第一张图片中,当\(\alpha=1.6\)时,迭代次数大于40之后,损失函数明显越来越大。

在第二张图片中,当\(\alpha = 0.00001\)时,损失函数每一次迭代减少的非常小,收敛速度很慢,我们可能需要很多次迭代才能得到局部最优解。

有时候,在梯度下降算法中,学习率并不总是固定的,有时候也会依据梯度来改变学习率。

参考链接:

梯度下降小结

梯度下降法小结

原文地址:https://www.cnblogs.com/liyier/p/11816925.html

时间: 2024-10-09 23:46:32

线性回归之梯度下降算法的相关文章

线性回归与梯度下降算法

线性回归与梯度下降算法 作者:上品物语 知识点: 线性回归概念 梯度下降算法 l  批量梯度下降算法 l  随机梯度下降算法 l  算法收敛判断方法 1.1   线性回归 在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合. 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分

机器学习(Andrew Ng)笔记(二):线性回归模型 &amp; 梯度下降算法

线性回归模型 回忆一下第一节课提出的预测房屋每平方单位价格的例子.在这个例子中,我们可以画一条直线,尽量符合数据点的分布趋势.我们已经知道这是一个回归问题,即预测连续值的输出.实际上,这是一个典型的线性回归模型.之所以这样定义,大概是因为回归方程可以用一个线性函数来表示. 我们可以假设这个线性函数为: 这是一个关于x的一元一次方程.其中两个参数的值我们还不知道,要根据训练集中的数据求解出来.这里要定义几个概念,我们已经有的数据,即房屋面积与单价的对应数据对,被称作训练集.x作为房屋面积,称作输入

简单多元线性回归(梯度下降算法与矩阵法)

多元线性回归是最简单的机器学习模型,通过给定的训练数据集,拟合出一个线性模型,进而对新数据做出预测. 对应的模型如下: n: 特征数量. 一般选取残差平方和最小化作为损失函数,对应为: M:训练样本数量. 通过最小化代价损失函数,来求得 值,一般优化的方法有两种,第一是梯度下降算法(Gradient Descent),第二种是矩阵法(The normal equations). 梯度下降算法

斯坦福CS229机器学习课程笔记一:线性回归与梯度下降算法

应该是去年的这个时候,我开始接触机器学习的相关知识,当时的入门书籍是<数据挖掘导论>.囫囵吞枣般看完了各个知名的分类器:决策树.朴素贝叶斯.SVM.神经网络.随机森林等等:另外较为认真地复习了统计学,学习了线性回归,也得以通过orange.spss.R做一些分类预测工作.可是对外说自己是搞机器学习的还是不太自信,毕竟和科班出身的各位大牛相比自己对这些模型.算法的理解只能算是“知其然而不知其所以然”,用起来总感觉哪里不对劲. 因此,去年早早地就把网易公开课上Andrew大神的斯坦福CS229课程

[Exercise]线性回归、梯度下降算法

1.梯度下降 1.1批梯度下降 eg1:用梯度下降法确定h(x)=x^2-t*x-t中参数t的值 注意迭代因子的选择很重要QAQ,如果程序结果成了发散的就要看看是不是迭代因子选的不好.[最后那个-0.01是无意中试出来的QwQ 1 def hypo(t,x): #precise answer : t=2 2 return (x*x-t*x-t) 3 4 def cost(t): 5 tmp=0 6 for i in range(0,num): 7 tmp+=(yy[i]-hypo(t,xx[i]

机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

本文介绍了机器学习中基本的优化算法-梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有样本的特征向量组成的矩阵 x(i) 是第i个样本包含的所有特征组成的向量x(i)=(x(i)1,x(i)2...,x(i)n) y(i) 第i个样本的label,每个样本只有一个label,y(i)是标量(一个数值) hθ(x(i)) :拟合函数,机器学习中可以用多种类型的拟合函数 θ 是函数变量,

flink 批量梯度下降算法线性回归参数求解(Linear Regression with BGD(batch gradient descent) )

1.线性回归 假设线性函数如下: 假设我们有10个样本x1,y1),(x2,y2).....(x10,y10),求解目标就是根据多个样本求解theta0和theta1的最优值. 什么样的θ最好的呢?最能反映这些样本数据之间的规律呢? 为了解决这个问题,我们需要引入误差分析预测值与真实值之间的误差为最小. 2.梯度下降算法 梯度下降的场景: 梯度下降法的基本思想可以类比为一个下山的过程.假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷). 但此时山上的浓雾很

梯度下降算法&amp;线性回归算法

**机器学习的过程说白了就是让我们编写一个函数使得costfunction最小,并且此时的参数值就是最佳参数值. 定义 假设存在一个代价函数 fun:\(J\left(\theta_{0}, \theta_{1}\right)\) 通过不断地调整\(\theta_{0}\)和\(\theta_{1}\)是函数\(J\left(\theta_{0}, \theta_{1}\right)\)取得最小值 梯度下降就是使J不断通过导数下降的一种算法 \(\theta_{j}:=\theta_{j}-\a

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降 本文会讲到: (1)线性回归的定义 (2)单变量线性回归 (3)cost function:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)feature scaling:加快梯度下降执行速度的方法 (6)多变量线性回归   Linear Regression 注意一句话:多变量线性回归之前必须要Feature Scaling! 方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个