Python语言描述随机梯度下降法


Posted in Python onJanuary 04, 2018

1.梯度下降

1)什么是梯度下降?

因为梯度下降是一种思想,没有严格的定义,所以用一个比喻来解释什么是梯度下降。

Python语言描述随机梯度下降法

简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。如图所示,黑线标注的路线所指的方向并不是真正的地方。

既然是选择一个方向下山,那么这个方向怎么选?每次该怎么走?

先说选方向,在算法中是以随机方式给出的,这也是造成有时候走不到真正最低点的原因。

如果选定了方向,以后每走一步,都是选择最陡的方向,直到最低点。

总结起来就一句话:随机选择一个方向,然后每次迈步都选择最陡的方向,直到这个方向上能达到的最低点。

2)梯度下降是用来做什么的?

在机器学习算法中,有时候需要对原始的模型构建损失函数,然后通过优化算法对损失函数进行优化,以便寻找到最优的参数,使得损失函数的值最小。而在求解机器学习参数的优化算法中,使用较多的就是基于梯度下降的优化算法(GradientDescent,GD)。

3)优缺点

优点:效率。在梯度下降法的求解过程中,只需求解损失函数的一阶导数,计算的代价比较小,可以在很多大规模数据集上应用

缺点:求解的是局部最优值,即由于方向选择的问题,得到的结果不一定是全局最优

步长选择,过小使得函数收敛速度慢,过大又容易找不到最优解。

2.梯度下降的变形形式

根据处理的训练数据的不同,主要有以下三种形式:

1)批量梯度下降法BGD(BatchGradientDescent):

针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。

优点:全局最优解;易于并行实现;

缺点:当样本数据很多时,计算量开销大,计算速度慢

2)小批量梯度下降法MBGD(mini-batchGradientDescent)

把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性

优点:减少了计算的开销量,降低了随机性

3)随机梯度下降法SGD(stochasticgradientdescent)

每个数据都计算算一下损失函数,然后求梯度更新参数。

优点:计算速度快

缺点:收敛性能不好

总结:SGD可以看作是MBGD的一个特例,及batch_size=1的情况。在深度学习及机器学习中,基本上都是使用的MBGD算法。

3.随机梯度下降

随机梯度下降(SGD)是一种简单但非常有效的方法,多用用于支持向量机、逻辑回归等凸损失函数下的线性分类器的学习。并且SGD已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。

SGD既可以用于分类计算,也可以用于回归计算。

1)分类

a)核心函数

sklearn.linear_model.SGDClassifier

b)主要参数(详细参数)

loss:指定损失函数。可选值:‘hinge'(默认),‘log',‘modified_huber',‘squared_hinge',‘perceptron',

"hinge":线性SVM

"log":逻辑回归

"modified_huber":平滑损失,基于异常值容忍和概率估计

"squared_hinge":带有二次惩罚的线性SVM

"perceptron":带有线性损失的感知器

alpha:惩罚系数

c)示例代码及详细解释

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.datasets.samples_generator import make_blobs

##生产数据
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)

##训练数据
clf = SGDClassifier(loss="hinge", alpha=0.01)
clf.fit(X, Y)

## 绘图
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)

##生成二维矩阵
X1, X2 = np.meshgrid(xx, yy)
##生产一个与X1相同形状的矩阵
Z = np.empty(X1.shape)
##np.ndenumerate 返回矩阵中每个数的值及其索引
for (i, j), val in np.ndenumerate(X1):
  x1 = val
  x2 = X2[i, j]
  p = clf.decision_function([[x1, x2]]) ##样本到超平面的距离
  Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ['dashed', 'solid', 'dashed']
colors = 'k'
##绘制等高线:Z分别等于levels
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
##画数据点
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired,
      edgecolor='black', s=20)
plt.axis('tight')
plt.show()

d)结果图

Python语言描述随机梯度下降法

2)回归

SGDRegressor非常适合回归问题具有大量训练样本(>10000),对于其他的问题,建议使用的Ridge,Lasso或ElasticNet。

a)核心函数

sklearn.linear_model.SGDRegressor

b)主要参数(详细参数)

loss:指定损失函数。可选值‘squared_loss'(默认),‘huber',‘epsilon_insensitive',‘squared_epsilon_insensitive'

说明:此参数的翻译不是特别准确,请参考官方文档。

"squared_loss":采用普通最小二乘法

"huber":使用改进的普通最小二乘法,修正异常值

"epsilon_insensitive":忽略小于epsilon的错误

"squared_epsilon_insensitive":

alpha:惩罚系数

c)示例代码

因为使用方式与其他线性回归方式类似,所以这里只举个简单的例子:

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = linear_model.SGDRegressor()
clf.fit(X, y)

总结

以上就是本文关于Python语言描述随机梯度下降法的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python 调用c语言函数的方法
Sep 29 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
python 用下标截取字符串的实例
Dec 25 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
python标准库os库的函数介绍
Feb 12 Python
python实现126邮箱发送邮件
May 20 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 #Python
python使用xpath中遇到:到底是什么?
Jan 04 #Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 #Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 #Python
Python中实现最小二乘法思路及实现代码
Jan 04 #Python
Python找出最小的K个数实例代码
Jan 04 #Python
Python编程把二叉树打印成多行代码
Jan 04 #Python
You might like
PHP之生成GIF动画的实现方法
2013/06/07 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
vue实现记事本功能
2019/06/26 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
创建Django项目图文实例详解
2019/06/06 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python 表格打印代码实例解析
2019/10/12 Python
在python中使用nohup命令说明
2020/04/16 Python
python复合条件下的字典排序
2020/12/18 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
护士辞职信范文
2014/01/19 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
优秀教师演讲稿
2014/05/06 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
辞职离别感言
2015/08/04 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript