看了coursea的机器学习课,知道了梯度下降法。一开始只是对其做了下简单的了解。随着内容的深入,发现梯度下降法在很多算法中都用的到,除了之前看到的用来处理线性模型,还有BP神经网络等。于是就有了这篇文章。

本文主要讲了梯度下降法的两种迭代思路,随机梯度下降(Stochastic gradient descent)和批量梯度下降(Batch gradient descent)。以及他们在python中的实现。

梯度下降法

梯度下降是一个最优化算法,通俗的来讲也就是沿着梯度下降的方向来求出一个函数的极小值。那么我们在高等数学中学过,对于一些我们了解的函数方程,我们可以对其求一阶导和二阶导,比如说二次函数。可是我们在处理问题的时候遇到的并不都是我们熟悉的函数,并且既然是机器学习就应该让机器自己去学习如何对其进行求解,显然我们需要换一个思路。因此我们采用梯度下降,不断迭代,沿着梯度下降的方向来移动,求出极小值。

此处我们还是用coursea的机器学习课中的案例,假设我们从中介那里拿到了一个地区的房屋售价表,那么在已知房子面积的情况下,如何得知房子的销售价格。显然,这是一个线性模型,房子面积是自变量x,销售价格是因变量y。我们可以用给出的数据画一张图。然后,给出房子的面积,就可以从图中得知房子的售价了。

现在我们的问题就是,针对给出的数据,如何得到一条最拟合的直线。

对于线性模型,如下。

  • h(x)是需要拟合的函数。
  • J(θ)称为均方误差或cost function。用来衡量训练集众的样本对线性模式的拟合程度。
  • m为训练集众样本的个数。
  • θ是我们最终需要通过梯度下降法来求得的参数。
h(θ)=∑j=0nθjxjJ(θ)=12m∑i=0m(yi−hθ(xi))2h(θ)=∑j=0nθjxjJ(θ)=12m∑i=0m(yi−hθ(xi))2

接下来的梯度下降法就有两种不同的迭代思路。

批量梯度下降(Batch gradient descent)

现在我们就要求出J(θ)取到极小值时的θTθT向量。之前已经说过了,沿着函数梯度的方向下降就能最快的找到极小值。

  1. 计算J(θ)关于θTθT的偏导数,也就得到了向量中每一个θθ的梯度。

    ∂J(θ)∂θj=−1m∑i=0m(yi−hθ(xi))∂∂θj(yi−hθ(xi))=−1m∑i=0m(yi−hθ(xi))∂∂θj(∑j=0nθjxij−yi)=−1m∑i=0m(yi−hθ(xi))xij(1)(2)(3)(1)∂J(θ)∂θj=−1m∑i=0m(yi−hθ(xi))∂∂θj(yi−hθ(xi))(2)=−1m∑i=0m(yi−hθ(xi))∂∂θj(∑j=0nθjxji−yi)(3)=−1m∑i=0m(yi−hθ(xi))xji
  2. 沿着梯度的方向更新参数θ的值
    θj:=θj+α∂J(θ)∂θj:=θj−α1m∑i=0m(yi−hθ(xi))xijθj:=θj+α∂J(θ)∂θj:=θj−α1m∑i=0m(yi−hθ(xi))xji
  3. 迭代直到收敛。

可以看到,批量梯度下降是用了训练集中的所有样本。因此在数据量很大的时候,每次迭代都要遍历训练集一遍,开销会很大,所以在数据量大的时候,可以采用随机梯度下降法。

随机梯度下降(Stochastic gradient descent)

和批量梯度有所不同的地方在于,每次迭代只选取一个样本的数据,一旦到达最大的迭代次数或是满足预期的精度,就停止。

可以得出随机梯度下降法的θ更新表达式。

θj:=θj−α1m(yi−hθ(xi))xijθj:=θj−α1m(yi−hθ(xi))xji

迭代直到收敛。

两种迭代思路的python实现

下面是python的代码实现,现在仅仅是用纯python的语法(python2.7)来实现的。随着学习的深入,届时还会有基于numpy等一些库的实现,下次补充。

#encoding:utf-8#随机梯度 def stochastic_gradient_descent(x,y,theta,alpha,m,max_iter): """随机梯度下降法,每一次梯度下降只使用一个样本。  :param x: 训练集种的自变量  :param y: 训练集种的因变量  :param theta: 待求的权值  :param alpha: 学习速率  :param m: 样本总数  :param max_iter: 最大迭代次数  """ deviation = 1 iter = 0 flag = 0 while True: for i in range(m): #循环取训练集中的一个 deviation = 0 h = theta[0] * x[i][0] + theta[1] * x[i][1] theta[0] = theta[0] + alpha * (y[i] - h)*x[i][0] theta[1] = theta[1] + alpha * (y[i] - h)*x[i][1] iter = iter + 1 #计算误差 for i in range(m): deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2 if deviation <EPS or iter >max_iter: flag = 1 break if flag == 1 : break return theta, iter #批量梯度 def batch_gradient_descent(x,y,theta,alpha,m,max_iter): """批量梯度下降法,每一次梯度下降使用训练集中的所有样本来计算误差。  :param x: 训练集种的自变量  :param y: 训练集种的因变量  :param theta: 待求的权值  :param alpha: 学习速率  :param m: 样本总数  :param max_iter: 最大迭代次数  """ deviation = 1 iter = 0 while deviation > EPS and iter < max_iter: deviation = 0 sigma1 = 0 sigma2 = 0 for i in range(m): #对训练集中的所有数据求和迭代 h = theta[0] * x[i][0] + theta[1] * x[i][1] sigma1 = sigma1 + (y[i] - h)*x[i][0] sigma2 = sigma2 + (y[i] - h)*x[i][1] theta[0] = theta[0] + alpha * sigma1 /m theta[1] = theta[1] + alpha * sigma2 /m #计算误差 for i in range(m): deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2 iter = iter + 1 return theta, iter #运行 为两种算法设置不同的参数 # data and init matrix_x = [[2.1,1.5],[2.5,2.3],[

转载于:https://www.cnblogs.com/xieqing/p/6519853.html

线性回归与梯度下降法——原理与实现相关推荐

  1. 线性回归之梯度下降法原理介绍

    线性回归之梯度下降法 1.梯度的概念 梯度是一个向量,对于一个多元函数fff而言,fff在点P(x,y)P(x,y)P(x,y)的梯度是fff在点PPP处增大最快的方向,即以f在P上的偏导数为分量的向 ...

  2. 梯度下降法原理解析(大白话+公式推理)

    目录 摘 要 第一章:梯度下降法原理解析 1.1梯度下降算法的浅层解析(深入浅出的理解,有些专业名词在这一节只需混个眼熟即可,         1.2中就会通过前后呼应的方式进行解析.) 1.2  梯 ...

  3. 梯度下降法原理及python实现

    文章目录 引言 梯度 单变量梯度下降法 单变量梯度下降原理 python实现单变量梯度下降 批量梯度下降法 批量梯度下降法原理 python实现多变量梯度下降 梯度下降算法数据归一化 随机梯度下降法 ...

  4. 线性回归之梯度下降法介绍

    线性回归之梯度下降法介绍 上一篇博文中介绍了最基本的梯度下降法实现流程,常见的梯度下降算法有: 全梯度下降算法(Full gradient descent), 随机梯度下降算法(Stochastic ...

  5. 机器学习入门系列一(关键词:单变量线性回归,梯度下降法)

    机器学习入门系列一(关键词:单变量线性回归,梯度下降法) 如上图所示,我们的目标是希望通过这些数据得到城市人口数和利润可能的对应关系,并可以通过城市人口数(利润)来预测它的利润(城市人口数),在这里我 ...

  6. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  7. matlab求nmse,梯度下降法原理与仿真系列(1)

    更多相关内容请关注vx公号 优化与算法 便捷及时阅览 1 引言 梯度下降法(Gradient Descent)也称为最速下降法(Steepest Descent),是法国数学家奥古斯丁·路易·柯西 ( ...

  8. 实现线性回归的梯度下降法算法,解决糖尿病预测问题,输出mse和R2的值。

    实现线性回归的梯度下降法算法,解决糖尿病预测问题,输出mse和R2的值. 以下为糖尿病的实验报告 一.问题描述 实现线性回归的梯度下降法算法,解决糖尿病预测问题,输出mse和R2的值. 二.实验目的 ...

  9. 梯度下降算法c语言实现,机器学习中梯度下降法原理及用其解决线性回归问题的C语言实现...

    本文讲梯度下降(Gradient Descent)前先看看利用梯度下降法进行监督学习(例如分类.回归等)的一般步骤: 1, 定义损失函数(Loss Function) 2, 信息流forward pr ...

最新文章

  1. Linux下防止文件误删方法
  2. C# 方法中的this参数
  3. java list按照元素对象的指定多个字段属性进行排序
  4. java编程彩球滑梯作弊_课内资源 - 基于C++的学生成绩管理系统
  5. vue里面v-cloak/v-text/v-html/v-pre的应用
  6. python模块-re模块
  7. 厦门大学人工智能研究院招收2022年推荐免试研究生
  8. Linux系统下卸载VMware Workstation软件
  9. 游戏推广中CPA,CPT和CPS是什么意思?
  10. mysql查看锁死的sql,最全指南
  11. 老男孩教育教育46期 LIHAO
  12. Creator 开发微信小游戏-好友排行榜
  13. C语言入门,编写程序,输出两个整数中的较大值。
  14. 【C语言】输出斐波那契数列 1 1 2 3 5 8 13 21...(知识点:一维数组、规律分析)
  15. 【论文笔记】Image Manipulation Detection by Multi-View Multi-Scale Supervision
  16. Calico集成kubernetes的CNI网络部署全过程、启用CA自签名
  17. 移动固态硬盘删除分区(包括EFI分区)
  18. 基于Android的智慧校园的设计与实现
  19. 中国电信运营商重组与3G标准
  20. php百度短网址dwz.cn接口

热门文章

  1. C语言指针:定义,使用及计算指针大小
  2. K8S 基于NFS实现文件集群间共享
  3. mockjs针对name的value设置生成规则语法示例
  4. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示
  5. Python Django 自定义Manager实现批量删除(逻辑删除)
  6. Spring注解开发-Bean注册
  7. linux服务器问题总结
  8. Flash,EEPROM区别
  9. 程序员生存定律--程序人生的出口
  10. 关于STM中SPI运用的NSS引脚解读