机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。

  • 梯度下降法(GD)
  • 随即梯度下降(SGD)
  • 代码实现

如果想细致的了解:-》 梯度下降法

梯度下降法(GD)

假设函数fx, 代价函数cost,有如下表达式:
f(x)=w1x1+w2x2+bcost(w)=1n∑i=1n(f(xi)−yi)w1=w1old−α∂cost(w)∂w1cost(w)w2=w2old−α∂cost(w)∂w2cost(w)\begin{aligned}f\left( x\right) =w_{1}x_{1}+w_{2}x_{2}+b\\ cost\left( w\right) =\dfrac{1}{n}\sum ^{n}_{i=1}\left( f(x_{i}\right) -y_{i}) \\ w_{1}=w_{1old}-\alpha \dfrac{\partial cos t\left( w\right) }{\partial w_{1}}cos t\left( w\right) \\ w _{2}=w_{2old}-\alpha \dfrac{\partial cos t\left( w\right) }{\partial w_{2}}cos t\left( w\right) \end{aligned}f(x)=w1​x1​+w2​x2​+bcost(w)=n1​i=1∑n​(f(xi​)−yi​)w1​=w1old​−α∂w1​∂cost(w)​cost(w)w2​=w2old​−α∂w2​∂cost(w)​cost(w)​
从上面公式,我们得出如下结论:
1.参数w,b每更新一次,就需要计算一次全体数据对相应参数的偏导数,这个计算量是很大的,函数的收敛速度会在数据量很大的时候会很慢。
2.与SGD不同,每一次参数的改变,都能保证cost是朝着全局最小方向移动的。
3.如果cost非凸函数,函数可能会陷入局部最优。

随即梯度下降(SGD)

公式如下:
f(x)=w1x1+w2x2+bf\left( x\right) =w_{1}x_{1}+w_{2}x_{2}+bf(x)=w1​x1​+w2​x2​+b
for(i=0,i<=n,i++)cost(w)=(f(xi)−yi)w1=w1old−α∂cost(w)∂w1cost(w)w2=w2old−α∂cost(w)∂w2cost(w)for (i=0,i<=n,i++)\\ cost\left( w\right) =(f(x_i)-y_i)\\ w_{1}=w_{1old}-\alpha \dfrac{\partial cos t\left( w\right) }{\partial w_{1}}cos t\left( w\right) \\ w _{2}=w_{2old}-\alpha \dfrac{\partial cos t\left( w\right) }{\partial w_{2}}cos t\left( w\right) for(i=0,i<=n,i++)cost(w)=(f(xi​)−yi​)w1​=w1old​−α∂w1​∂cost(w)​cost(w)w2​=w2old​−α∂w2​∂cost(w)​cost(w)

从上面公式,得出如下结论:

  1. SGD中每更新一次参数,只计算了1个batch的梯度(上面公式假设batch=1),大大加快了函数的收敛速度。
    2.SGD每一次更新参数只考虑了一个数据,可能不会每一次都是朝着全局最优的方向移动,最终可能无法收敛到最小,但是会解决陷入局部最优的问题。

代码实现

以波士顿房价预测为案例
导入数据

import numpy as np
path = 'Desktop/波士顿房价/trian.csv'
data = np.loadtxt(path, delimiter = ",", skiprows=1)
data.shape

分割数据

train = data[:int(data.shape[0]*0.8)]
test = data[int(data.shape[0]*0.8):]
print(train.shape, test.shape)
train_x = train[:,:-1]
train_y = train[:,13:]
test_x = test[:,:-1]
test_y = test[:,13:]
print(train_x.shape, train_y.shape)

class Network:def __init__(self, num_weights):self.num_weights = num_weightsself.w = np.random.rand(num_weights, 1)self.b = 0def forward(self, x):z = np.dot(x, self.w) + self.b return zdef loss(self, z, y):cost = (z-y)*(z-y)cost = np.mean(cost)return costdef gradient(self, z, y):w = (z-y)*train_xw = np.mean(w, axis=0)w = np.array(w).reshape([13, 1])b = z-yb = np.mean(b)return w, bdef update(self, gradient_w, gradient_b, eta):self.w = self.w - eta*gradient_wself.b = self.b - eta*gradient_b
#梯度下降def train_GD(self, items, eta):for i in range(items):z = self.forward(train_x)loss = self.loss(z, train_y)gradient_w, gradient_b = self.gradient(z, train_y)self.update(gradient_w, gradient_b, eta)# if i % 100 == 0:test_loss = self.test()print('item:', i, 'loss:', loss, 'test_loss:', test_loss)
#随即梯度下降def train_SGD(self, num_epochs, batchsize, eta):for epoch_id in range(num_epochs):np.random.shuffle(train)losses = []for i in range(0, len(train), batchsize):# print(i, batchsize+i)mini_batchs = train[i:i + batchsize]for iter_id, mini_batch in enumerate(mini_batchs):# print(mini_batch)x = mini_batch[:-1]y = mini_batch[-1]z = self.forward(x)loss = self.loss(z, y)gradient_w, gradient_b = self.gradient(z, y)self.update(gradient_w, gradient_b, eta)losses.append(loss)sum = 0for i in losses:sum += iloss_mean = sum/len(losses)print('Epoch{}, loss{}, loss_mean{}'.format(epoch_id, loss, loss_mean))def test(self):z = self.forward(test_x)loss = self.loss(z, test_y)return lossnet = Network(13)
net.train_GD(100, eta=1e-9)
net.train_SGD(100, 5, 1e-9)

机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。相关推荐

  1. 使用随机梯度下降SGD的BP反向传播算法的PyTorch代码实现

    Index 目录索引 写在前面 PyTorch的 .data() PyTorch的 .item() BP with SGD的PyTorch代码实现 参考文章 写在前面 本文将用一个完整的例子,借助Py ...

  2. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

    批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...

  3. 深度学习中的随机梯度下降(SGD)简介

    随机梯度下降(Stochastic Gradient Descent, SGD)是梯度下降算法的一个扩展. 机器学习中反复出现的一个问题是好的泛化需要大的训练集,但大的训练集的计算代价也更大.机器学习 ...

  4. 随机梯度下降(SGD)与经典的梯度下降法的区别

    随机梯度下降(SGD)与经典的梯度下降法的区别 经典的优化方法,例如梯度下降法,在每次迭代过程中需要使用所有的训练数据,这就给求解大规模数据优化问题带来挑战. 知识点:随机梯度下降法(SGD).小批量 ...

  5. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)及 batch、epoch、iteration

    先介绍一下梯度下降:梯度下降是一种用于机器学习训练参数的一种优化方法.对损失函数进行梯度下降,"梯度"指误差梯度或误差斜率,"下降"指沿着误差斜率移动到误差较小 ...

  6. 经典梯度下降、随机梯度下降、批量梯度下降是个啥?

    假设某任务损失函数为 L L L,模型参数为 θ \theta θ,我们希望找到使损失函数最小的模型参数 θ ∗ = a r g min ⁡ L ( θ ) \theta^* = arg \min L ...

  7. 机器学习(四):批量梯度下降法(BGD)、随机梯度下降法(SGD)和小批量梯度下降法(MBGD)

    本文基于吴恩达老师的机器学习课程.看了吴恩达老师的机器学习课程,收获很多,想把课上学做的笔记结合自己的理解以及找到的一些资料综合起来做一个总结.大家感兴趣也可以自己去看一看吴恩达老师的课,这套课程,被 ...

  8. 梯度下降:全梯度下降算法(FG)、随机梯度下降算法(SG)、小批量梯度下降算法(mini-batch)、随机平均梯度下降算法(SAG)。梯度下降法算法比较和进一步优化。

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.2 梯度下降(Gradient Descent) 2.2. ...

  9. 最优化方法:梯度下降(批梯度下降和随机梯度下降)

    http://blog.csdn.net/pipisorry/article/details/23692455 梯度下降法(Gradient Descent) 梯度下降法是一个一阶最优化算法,通常也称 ...

最新文章

  1. python培训深圳-深圳Python培训机构排名
  2. 【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿
  3. pyinstaller将python脚本转成exe可执行文件
  4. xml 和android脚本之家,AndroidManifest.xml配置文件解析_Android_脚本之家
  5. IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”
  6. oracle plsql递归查询语句,oracle with 语句实现递归查询
  7. token 防止csrf
  8. OCX控件注册相关(检查是否注册,注册,反注册)
  9. 【Linux】linux内核学习
  10. Android中getDimension,getDimensionPixelOffset和getDimensionPixelSize 区别
  11. tensorflow应用问题记录
  12. 【python】蔡勒公式计算日期
  13. C# 添加windows右键菜单
  14. Bootstrap基础三 排版
  15. 你需要来自TrustedInstaller的权限才能对此文件夹进行更改(已解决)
  16. mhl数据线_利用MHL数据线 手机同屏到乐视电视X50air上
  17. 编译android vendor,Android ----制作自己的Vendor
  18. oracle逗号隔开行转列_oralce逗号分割变多行-Oracle
  19. Selenium元素操作与属性值_Sinno_Song_新浪博客
  20. 羊皮卷-选择的力量(二)

热门文章

  1. C1认证:修改《植物大战僵尸》的文件
  2. 零跑汽车财报解读:短跑“增程”双动力,长跑“自研”加速度
  3. 常见生物遗传密码子的简并碱基
  4. 数字电子技术 八路呼叫器 Multisim仿真 课程报告
  5. 11款AI人工智能工具,轻松满足工作需求
  6. 机器学习中精准度、召回率、准确率、F1 Score、G分数计算学习笔记
  7. java程序员基础算法_java程序员必知的十种程序算法
  8. 芯片封装-fcCSP
  9. php radiobutton,VB.Net单选按钮(RadioButton)
  10. PHP+mysql民用无人机实名登记系统-计算机毕业设计源码24602