机器学习(1)之梯度下降(gradient descent)

题记:最近零碎的时间都在学习Andrew Ng的machine learning,因此就有了这些笔记。

梯度下降是线性回归的一种(Linear Regression),首先给出一个关于房屋的经典例子,

面积(feet2) 房间个数 价格(1000$)
2104 3 400
1600 3 330
2400 3 369
1416 2 232
3000 4 540
... ... ..

上表中面积和房间个数是输入参数,价格是所要输出的解。面积和房间个数分别表示一个特征,用X表示。价格用Y表示。表格的一行表示一个样本。现在要做的是根据这些样本来预测其他面积和房间个数对应的价格。可以用以下图来表示,即给定一个训练集合,学习函数h,使得h(x)能符合结果Y。

一. 批梯度下降算法

可以用以下式子表示一个样本:

θ表示X映射成Y的权重,x表示一次特征。假设x0=1,上式就可以写成:

分别使用x(j),y(j)表示第J个样本。我们计算的目的是为了让计算的值无限接近真实值y,即代价函数可以采用LMS算法

要获取J(θ)最小,即对J(θ)进行求导且为零:

当单个特征值时,上式中j表示系数(权重)的编号,右边的值赋值给左边θj从而完成一次迭代。

单个特征的迭代如下:

多个特征的迭代如下:

上式就是批梯度下降算法(batch gradient descent),当上式收敛时则退出迭代,何为收敛,即前后两次迭代的值不再发生变化了。一般情况下,会设置一个具体的参数,当前后两次迭代差值小于该参数时候结束迭代。注意以下几点:

(1) a 即learning rate,决定的下降步伐,如果太小,则找到函数最小值的速度就很慢,如果太大,则可能会出现overshoot the minimum的现象;
(2) 初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值;
(3) 越接近最小值时,下降速度越慢;
(4) 计算批梯度下降算法时候,计算每一个θ值都需要遍历计算所有样本,当数据量的时候这是比较费时的计算。
批梯度下降算法的步骤可以归纳为以下几步:
(1)先确定向下一步的步伐大小,我们称为Learning rate ;
(2)任意给定一个初始值:θ向量,一般为0向量
(3)确定一个向下的方向,并向下走预先规定的步伐,并更新θ向量
(4)当下降的高度小于某个定义的值,则停止下降;

二. 随机梯度下降算法

因为每次计算梯度都需要遍历所有的样本点。这是因为梯度是J(θ)的导数,而J(θ)是需要考虑所有样本的误差和 ,这个方法问题就是,扩展性问题,当样本点很大的时候,基本就没法算了。所以接下来又提出了随机梯度下降算法(stochastic gradient descent )。随机梯度下降算法,每次迭代只是考虑让该样本点的J(θ)趋向最小,而不管其他的样本点,这样算法会很快,但是收敛的过程会比较曲折,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。所以适合用于较大训练集的case。

三.代码实现

随机梯度下降算法的python的实现:

 1 # coding=utf-8
 2 #!/usr/bin/python
 3
 4 '''
 5 Created on 2014年9月6日
 6
 7 @author: Ryan C. F.
 8
 9 '''
10
11 #Training data set
12 #each element in x represents (x0,x1,x2)
13 x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)]
14 #y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
15 y = [95.364,97.217205,75.195834,60.105519,49.342380]
16
17
18 epsilon = 0.0001
19 #learning rate
20 alpha = 0.01
21 diff = [0,0]
22 error1 = 0
23 error0 =0
24 m = len(x)
25
26
27 #init the parameters to zero
28 theta0 = 0
29 theta1 = 0
30 theta2 = 0
31
32 while True:
33
34     #calculate the parameters
35     for i in range(m):
36
37         diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
38
39         theta0 = theta0 + alpha * diff[0]* x[i][0]
40         theta1 = theta1 + alpha * diff[0]* x[i][1]
41         theta2 = theta2 + alpha * diff[0]* x[i][2]
42
43     #calculate the cost function
44     error1 = 0
45     for lp in range(len(x)):
46         error1 += ( y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] ) )**2/2
47
48     if abs(error1-error0) < epsilon:
49         break
50     else:
51         error0 = error1
52
53     print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f'%(theta0,theta1,theta2,error1)
54
55 print 'Done: theta0 : %f, theta1 : %f, theta2 : %f'%(theta0,theta1,theta2)

批梯度下降算法

 1 # coding=utf-8
 2 #!/usr/bin/python
 3
 4 '''
 5 Created on 2014年9月6日
 6
 7 @author: Ryan C. F.
 8
 9 '''
10
11 #Training data set
12 #each element in x represents (x0,x1,x2)
13 x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)]
14 #y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
15 y = [95.364,97.217205,75.195834,60.105519,49.342380]
16
17
18 epsilon = 0.000001
19 #learning rate
20 alpha = 0.001
21 diff = [0,0]
22 error1 = 0
23 error0 =0
24 m = len(x)
25
26 #init the parameters to zero
27 theta0 = 0
28 theta1 = 0
29 theta2 = 0
30 sum0 = 0
31 sum1 = 0
32 sum2 = 0
33 while True:
34
35     #calculate the parameters
36     for i in range(m):
37         #begin batch gradient descent
38         diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
39         sum0 = sum0 + alpha * diff[0]* x[i][0]
40         sum1 = sum1 + alpha * diff[0]* x[i][1]
41         sum2 = sum2 + alpha * diff[0]* x[i][2]
42         #end  batch gradient descent
43     theta0 = sum0;
44     theta1 = sum1;
45     theta2 = sum2;
46     #calculate the cost function
47     error1 = 0
48     for lp in range(len(x)):
49         error1 += ( y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] ) )**2/2
50
51     if abs(error1-error0) < epsilon:
52         break
53     else:
54         error0 = error1
55
56     print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f'%(theta0,theta1,theta2,error1)
57
58 print 'Done: theta0 : %f, theta1 : %f, theta2 : %f'%(theta0,theta1,theta2)

通过上述批梯度下降和随机梯度下降算法代码的对比,不难发现两者的区别:

1. 随机梯度下降算法在迭代的时候,每迭代一个新的样本,就会更新一次所有的theta参数。

35     for i in range(m):
36
37         diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
38
39         theta0 = theta0 + alpha * diff[0]* x[i][0]
40         theta1 = theta1 + alpha * diff[0]* x[i][1]
41         theta2 = theta2 + alpha * diff[0]* x[i][2]

2. 批梯度下降算法在迭代的时候,是完成所有样本的迭代后才会去更新一次theta参数

35     #calculate the parameters
36     for i in range(m):
37         #begin batch gradient descent
38         diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
39         sum0 = sum0 + alpha * diff[0]* x[i][0]
40         sum1 = sum1 + alpha * diff[0]* x[i][1]
41         sum2 = sum2 + alpha * diff[0]* x[i][2]
42         #end  batch gradient descent
43     theta0 = sum0;
44     theta1 = sum1;
45     theta2 = sum2;

因此当样本数量很大时候,批梯度得做完所有样本的计算才能更新一次theta,从而花费的时间远大于随机梯度下降。但是随机梯度下降过早的结束了迭代,使得它获取的值只是接近局部最优解,而并非像批梯度下降算法那么是局部最优解。

因此我觉得以上的差别才是批梯度下降与随机梯度下降最本质的差别。

机器学习(1)之梯度下降(gradient descent)相关推荐

  1. 机器学习代码实战——梯度下降(gradient descent)

    文章目录 1.实验目的 2.梯度下降 2.1.借助sklearn库 2.2.手写梯度下降函数 1.实验目的 本实验将使用两种方法实现梯度下降算法并可打印出参数,可视化梯度下降过程.第一种方法是借助sk ...

  2. 【李宏毅机器学习】04:梯度下降Gradient Descent

    李宏毅机器学习04:梯度下降Gradient Descent 文章目录 李宏毅机器学习04:梯度下降Gradient Descent 一.梯度下降方法 二.梯度下降的改进方法 Tip 1: Tunin ...

  3. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降

    Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现 在上一小节中,我们已经成功的构建了逻辑回归的损失函数,但由于逻辑回归模型本身的特殊性,我们在构造损失函数时无法采用 ...

  4. 梯度下降(Gradient Descent),一句代码,一个式子

    一直以来,总是觉得国外的PhD们的教育以及课程的安排很好很强大,虽然是说很累作业多工作量大,但是功率大了,效果好点儿,浪费的时间也少,年轻人哪有怕苦怕累的.比比身边好多每天睡超过12小时的研究生们,不 ...

  5. 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)

    前言: 上次写过一篇关于贝叶斯概率论的数学,最近时间比较紧,coding的任务比较重,不过还是抽空看了一些机器学习的书和视频,其中很推荐两个:一个是stanford的machine learning公 ...

  6. 梯度下降 gradient descent

    文章目录 导数 偏导数 方向导数 梯度 代价函数的梯度 梯度下降的详细算法 先决条件 算法过程 代价损失中 θ 偏导数公式推导 批量梯度下降(Batch Gradient Descent,BGD) 随 ...

  7. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...

    文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...

  8. 梯度下降 Gradient Descent 详解、梯度消失和爆炸

    1.什么是梯度 在微积分中,对多元函数的参数求∂偏导,把求得的各个参数的偏导数以向量形式写出来即为梯度. 例如对于函数f(x,y),分别对x,y求偏导,求得的梯度向量就是 (∂f/∂x, ∂f/∂y) ...

  9. 机器学习-线性回归与梯度下降

    线性回归 linear regression 符号定义 notation,仅为本教程中的符号定义. \(m\) 训练集中样本的数量 \(x\) 输入值,features. \(x^{(i)}\),表示 ...

最新文章

  1. 关于软件开发的随想,纯属意淫
  2. python叫什么-Python为什么叫爬虫?Python与爬虫有什么关系?
  3. (C#)设计模式之装饰模式
  4. python中赋值不正确的_python中关于赋值、浅拷贝与深拷贝的问题
  5. 软件测试团队分为哪些人员,产品团队、开发团队和测试团队是什么关系?
  6. 都是程序员,凭什么他工资比我高,下班比我早?
  7. 数学趣题——渔夫抓鱼问题
  8. 数据库 -- 单表的数据查询
  9. linux没法上网,LINUX没法上网?
  10. Elasticsearch-8.4.2 集群安装
  11. 如何用jquery动态改变 input 输入框的readonly属性及CSS样式
  12. Hadoop/Spark集群搭建图文全攻略
  13. 回炉重造七---磁盘存储和文件系统
  14. 查看电脑内存个数、主频(工作频率)、容量、位宽等的方法总结
  15. 汇编语言(王爽)-实验
  16. Windows XP下如何实现共享上网
  17. matlab snr mse,MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM...
  18. 微信发明者自曝 专利已秘密转让腾讯
  19. python使用KNeighborsClassifier出现FutureWarning: Unlike other reduction functions (e.g. `skew`, `kurtosi
  20. 104条PCB电路设计制作专业术语

热门文章

  1. Guava学习笔记:Ordering犀利的比较器
  2. 理解SharePoint中的备用访问映射(Alternate Access Mapping)
  3. 容器编排技术 -- Kubernetes 设计理念
  4. Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存
  5. 更改Linux系统的Hostname的四种方式
  6. STP端口状态特点、STP端口角色特点、链路状态发生变化,STP如何重新收敛? TCN何时发?uplinkfast技术、Portfast技术、backbonefast技术、常见的STP调整命令:
  7. iOS Class结构分析
  8. 分布式系统关注点(21)——构建「易测试」系统的“六脉神剑”
  9. SpringMVC 异步交互 AJAX 文件上传
  10. 04737 c++ 自学考试2019版 第四章课后程序设计题1