《机器学习》 梯度下降

2012-09-21 17:46 2712人阅读 评论(0) 收藏 举报
matrixc

参照《机器学习》这本书的第4.4.3节。

一.解决目标及情景假设:

当给定一些数据,输入x向量已知,输出y也已知,设计一个线性函数y=h(x)去拟合这些数据。

既然是线性函数,在此不妨设为h(x)=w0*x0+w1*x1。

此时我们遇到的问题就是如何确定w0和w1这两个参数,即w=(w0,w1)这个向量。

既然是拟合,则拟合效果可以用误差函数:E(w)=∑ [ h(x)- y ] ^2 / 2 来衡量。

其中w是权重二维向量,x是输入二维向量,x和y都是训练集的数据,即已知。

至于后面除于2只是为了之后的推导过程中对E求导时候可以消除系数,暂时可以不管。

因为我们解决的目标是找出一个向量w=(w0,w1)使得E(w)值最小,即误差最小。

其实这个问题本质上也是搜索最优解的问题,如果用暴力搜索的话,随机取每个可能的值去让机器每天每夜地跑,显然这是不可能的。
所以此时有一种搜索策略:梯度下降。

二. 梯度下降方法:

梯度其实就是高数求导方法,对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1)

梯度为最陡峭上升的方向,对应的梯度下降的训练法则为:

w=w-η▽E(w)

这里的η代表学习速率,决定梯度下降搜索中的步长 。

上式的w是向量,即可用将该式写成分量形式为:wi=wi-η*∂E/∂wi

现在关键就使计算∂E/∂wi:

推导过程很简单,书上写的很详细,这里只记录结论:

∂E/∂wi=∑(h(x)-y)*(xi)

这里的∑是对样本空间,即训练集进行一次遍历,耗费时间较大,可以使用梯度下降的随机近似:

随机梯度下降策略来改进时间。

三.随机梯度下降的随机近似:

既然是随机近似,则顾名思义,肯定是用近似方法来改善梯度下降时候的时间复杂度问题。

正如上所说,在∂E/∂wi=∑(h(x)-y)*(xi)
的时候∑耗费了大量的时间,特别是在训练集庞大的时候。

所以肯定有人会猜想,如果把求和去掉如何,即变为∂E/∂wi=(h(x)-y)*(xi)。

幸运的是,猜想成立了。

只是要注意一下标准的梯度下降和随机梯度下降的区别:

1.标准下降时在权值更新前汇总所有样例得到的标准梯度,随机下降则是通过考察每次训练实例来更新。

2.对于步长 η的取值,标准梯度下降的η比随机梯度下降的大。

因为标准梯度下降的是使用准确的梯度,理直气壮地走,随机梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心误入歧途南辕北辙了。

3.当E(w)有多个局部极小值时,随机梯度反而更可能避免进入局部极小值中。

四.代码及实例:

直接照着别人博客代码敲的一遍:http://blog.csdn.net/pennyliang/article/details/6998517

[cpp] view plaincopyprint?
  1. /*
  2. * 随机梯度下降实验:
  3. * 训练集输入为矩阵:
  4. * 1,4
  5. * 2,5
  6. * 5,1
  7. * 4,2
  8. * 输出结果为:
  9. * 19
  10. * 26
  11. * 19
  12. * 20
  13. * 需要参数为theta:
  14. * ?
  15. * ?
  16. *
  17. * 目标函数:y=theta0*x0+theta1*x1;
  18. *
  19. *
  20. * */
  21. #include<stdio.h>
  22. int main()
  23. {
  24. double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};
  25. double result[4]={19,26,19,20};
  26. double theta[2]={0,0};//初始为零向量
  27. double loss=10.0;
  28. for(int i=0;i<100&&loss>0.001;i++)
  29. {
  30. double error_sum=0;
  31. int j=i%4;
  32. {
  33. double h=0;
  34. for(int k=0;k<2;k++)
  35. {
  36. h+=matrix[j][k]*theta[k];
  37. }
  38. error_sum=result[j]-h;
  39. for(int k=0;k<2;k++)
  40. {
  41. theta[k]+=0.01*(error_sum)*matrix[j][k];//这里是关键
  42. }
  43. }
  44. printf("%lf,%lf\n",theta[0],theta[1]);
  45. double loss=0;
  46. for(int j=0;j<4;j++)
  47. {
  48. double sum=0;
  49. for(int k=0;k<2;k++)
  50. {
  51. sum+=matrix[j][k]*theta[k];
  52. }
  53. loss+=(sum-result[j])*(sum-result[j]);
  54. }
  55. printf("%lf\n",loss);
  56. }
  57. return 0;
  58. }
/** 随机梯度下降实验:* 训练集输入为矩阵:* 1,4* 2,5* 5,1* 4,2* 输出结果为:* 19* 26* 19* 20* 需要参数为theta:* ?* ?** 目标函数:y=theta0*x0+theta1*x1;*** */
#include<stdio.h>
int main()
{double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};double result[4]={19,26,19,20};double theta[2]={0,0};//初始为零向量double loss=10.0;for(int i=0;i<100&&loss>0.001;i++){double error_sum=0;int j=i%4;{double h=0;for(int k=0;k<2;k++){h+=matrix[j][k]*theta[k];}error_sum=result[j]-h;for(int k=0;k<2;k++){theta[k]+=0.01*(error_sum)*matrix[j][k];//这里是关键}}printf("%lf,%lf\n",theta[0],theta[1]);double loss=0;for(int j=0;j<4;j++){double sum=0;for(int k=0;k<2;k++){sum+=matrix[j][k]*theta[k];}loss+=(sum-result[j])*(sum-result[j]);}printf("%lf\n",loss);}return 0;}

结果可以得出c0=3,c1=4。

http://blog.csdn.net/wuyanyi/article/details/8003946

《机器学习》 梯度下降相关推荐

  1. 基于机器学习梯度下降优化算法来寻找最佳的线性回归模型

    https://www.toutiao.com/a6638782437587419652/ 幻风的AI之路 2018-12-25 18:12:27 线性回归模型 线性回归模型是一个非常简单的算法模型, ...

  2. 机器学习 | 梯度下降原理及Python实现

    文章目录 1. 梯度下降 1.1 批量梯度下降(BGD) 1.1.1 学习率的设置 1.1.2 Python 实现 BGD 1.2 随机梯度下降(SGD) 1.2.1 Python 实现 SGD 1. ...

  3. 03机器学习--梯度下降及python实现

    目录 ①概述 ②梯度下降法简单模拟 ③多元线性回归中使用梯度下降 ④优化(梯度下降法的向量化) ⑤数据的归一化 ⑥随机梯度下降法 ⑦scikit-learn中的随机梯度下降 ⑧关于梯度的调试 ⑨总结 ...

  4. python机器学习梯度下降求解逻辑回归

    Logistic Regression The data 我们将建立一个逻辑回归模型来预测一个学生是否被大学录取.假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会.你有以前 ...

  5. 机器学习中为什么需要梯度下降_机器学习 —— 多元梯度下降

    一.多维特征 前面所述的房价预测的线性模型,只用到了一维特征,即size,房屋尺寸,要用这个特征量来预测房屋价格: 当数据集的信息不止一种时,便有了多维特征,比如: 上图有四个X,即四个特征,来预测房 ...

  6. [ML]--梯度下降 GD 的理解和探究

    文章目录 1. Content 2. References 1. Content 2. References 深度理解机器学习"梯度下降" jianshu 一文读懂梯度下降算法 c ...

  7. 关于梯度下降法和牛顿法的数学推导

    作者:LogM 本文原载于 https://blog.csdn.net/qq_28739605/article/details/80862810,不允许转载~ 文章难免有错误之处,请在原文评论处指出~ ...

  8. 机器学习(11)线性回归(1)理论:损失函数(含最小二乘法)、正规方程、梯度下降、回归性能评估(均方差)

    目录 一.线性回归基础理论 1.定义与公式 2.线性关系(单特征与双特征) 2-1.单特征线性关系 2-2.双特征平面关系 2-3.其他线性模型 二.线性回归的损失和优化原理 1.损失函数 1.定义 ...

  9. 【机器学习入门】(7) 线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

    各位同学好,今天我和大家分享一下python机器学习中的线性回归算法.内容有: (1) 线性回归方程.(2) 损失函数推导.(3) 似然函数.(4) 三种梯度下降方法 1. 概念简述 线性回归是通过一 ...

  10. 机器学习01-定义、线性回归、梯度下降

    目录 一.定义 What is Machine Learning 二.建模 Model Representation 三.一元线性回归 Linear Regression with One Varia ...

最新文章

  1. android sqlite自定义函数,Android中自定义一个View的方法详解
  2. linux的子进程和父进程,[Linux进程]在父进程和子进程中分别对文件进行操作
  3. python演示验证图像叠加过程_Python叠加矩形框图层2种方法及效果代码实例
  4. 26岁,发25篇SCI,当上211教授、博导。
  5. Struts2 入门
  6. JavaScript实现字符串转换成驼峰表示法
  7. 【Java学习笔记十】输入输出流
  8. Java对象容器——List
  9. Python爬取B站5000条视频,揭秘为何千万人看「哪吒」流泪
  10. scp传服务器文件,使用tar、scp和screen在服务器之间传输文件
  11. (翻译) Android ListView 性能优化指南
  12. java 常量池是什么_Java常量池理解与总结
  13. iptables禁止国外ip访问-脚本
  14. 第三方模块:Python3 OS 文件/目录方法
  15. 阅读圣经丨变量引起的上下文
  16. Linux 进程管理
  17. 钓鱼c语言,C语言实现小猫钓鱼游戏
  18. 平台型时间信号强度曲线_MR动态增强扫描时间-信号强度曲线在骨骼肌肉系统肿瘤定性诊断中的价值...
  19. 如何使用shared_preferences?
  20. H2O with R 简明使用手记·上篇

热门文章

  1. 添加cacti监控_小水谈监控---Cacti安装(监控)
  2. 深入理解JVM虚拟机(二):垃圾回收机制
  3. c语言函数打印零星,C语言零星笔记--(const、typedef)
  4. c语言i o编程,C 语言输入输出 (I/O)
  5. Linux 如何快速找到运行中的进程
  6. Linux命令之---rm
  7. LOJ#6281. 数列分块入门 5
  8. 微信OPENID授权方法
  9. [译] 12步轻松搞定python装饰器 - 简书
  10. MySQL 数据备份与同步