作者:糖甜甜甜

经管人也可以学Python。

个人公众号: 经管人学数据分析

基本介绍

梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向。

梯度下降法特点:越接近目标值,步长越小,下降速度越慢。下面将通过公式来说明梯度下降法。

建立模型为拟合函数h(θ) :

接下来的目标是将该函数通过样本的拟合出来,得到最佳的函数模型。因此构建损失函数J(θ)(目的是通过求解min J(θ),得到在最优解下的θ向量),其中的每一项

都表示在已有的训练集上我们的拟合函数与 y之间的残差,计算其平方损失函数作为我们构建的风险函数(这里采用最小二乘法构造损失函数,在逻辑回归中也可采用最大似然估计构造损失函数从而估计参数)。

要使得最小J(θ),则对其J(θ)求导等于零。

在处理以下步骤时,可以用批量梯度下降算法(BGD)与随机梯度下降算法(SGD)。

批量梯度下降算法(BGD)

单个特征  的迭代如下:

a为步长,如果太小,则找到函数最小值的速度就很慢,如果太大,则可能会错过最小值,而使得函数值发散。初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值。

多个特征的迭代如下:

Repeat until convergence{

(for every )

}

当上式收敛时则退出迭代,一开始设置一个具体参数,当前后两次迭代差值小于该参数时候结束迭代。

使用梯度下降法,越接近最小值时,下降速度越慢。计算批量梯度下降法时,计算每一个θ值都需要遍历计算所有样本,当数据量比较大时这是比较费时的计算。

随机梯度下降算法(SGD)

为解决数据量大的时批量梯度下降算法费时的困境。随机梯度下降算法,每次迭代只是考虑让该样本点的J(θ)趋向最小,而不管其他的样本点,这样算法会很快,但是收敛的过程会比较曲折,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。该算法适合用于较大训练集的例子。

Loop{

for i=1 to m,{      (for every j) }

}

改进的随机梯度下降算法

为了避免迭代时系数出现周期性波动,同时让系数很快收敛,这里改进随机梯度下降算法。

1)在每次迭代时,调整更新步长a的值。随着迭代的进行,a越来越小,这会缓解系数的高频波动。同时为了避免a随着迭代不断减小到接近于0,约束a一定大于一个稍微大点的常数项。

2)每次迭代,改变样本的优化顺序。也就是随机选择样本来更新回归系数。这样做可以减少周期性的波动,因为样本顺序的改变,使得每次迭代不再形成周期性。

算法应用和python实现

梯度下降法可以用于在前面提到的logistic回归分类器中,主要是求解模型中的cost函数,这里用泰坦尼克数据集进行演示,并且使用python中的sklearn库进行实现,代码如下:

import pandas

from sklearn.linear_model import LinearRegression, LogisticRegression

from sklearn.model_selection import KFold, cross_val_score

import numpy as nptitanic = pandas.read_csv('E:\TitanicData\Titanic\\train.csv')

# print(titanic.describe())titanic['Age'] = titanic['Age'].fillna(titanic['Age'].mean())

# print(titanic.describe())# print(titanic['Sex'].unique())titanic.loc[titanic['Sex'] == 'male', 'Sex'] = 0titanic.loc[titanic['Sex'] == 'female', 'Sex'] = 1# print(titanic['Embarked'].unique())titanic['Embarked'] = titanic['Embarked'].fillna('S')titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2# print(titanic.columns)predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

#开始线性回归预测alg = LinearRegression()X = titanic[predictors]kf = KFold(n_splits=3)prediction = []

for train, test in kf.split(X):    x_train = titanic[predictors].iloc[train, :]    y_train = titanic['Survived'].iloc[train]    x_test = titanic[predictors].iloc[test, :]    y_test = titanic['Survived'].iloc[test]    alg.fit(x_train, y_train)    test_prediction = alg.predict(x_test)    prediction.append(test_prediction)prediction = np.concatenate(prediction)prediction[prediction > 0.5] = 1prediction[prediction <>0.5] = 0accuracy_linear = sum(prediction[prediction == titanic['Survived']])/len(prediction)

#查准率#score1 = cross_val_score(alg, X, titanic['Survived'], cv=3).mean()# cross_val_score是直接将算法得到的值与y_test进行对比算scoring# 这个步骤错误,因为线性回归得到的是概率值,需要后期判别到{0,1}上,才能和原y_test的数据进行比较算accuracy,所以LinearRegression不适合做cross_val_score的estimator。print(accuracy_linear, score1)

#开始逻辑回归预测alh = LogisticRegression()score = cross_val_score(alh, X, titanic['Survived'], cv=3).mean()

#logisticregression的算法结果直接是{0,1}两值,所以可以直接进行score比较算accuracy,所以这个alh适合这个estimator。print(score)

Python爱好者社区历史文章大合集:

python实现梯度下降法_梯度下降法及其Python实现相关推荐

  1. 梯度下降算法_梯度下降法的简单介绍以及实现

    梯度下降法的基本思想可以类比为一个下山的过程.假设这样一个场景:一个人被困在山上,需要从山上下来(i.e.找到山的最低点,也就是山谷).但此时山上的浓雾很大,导致可视度很低.因此,下山的路径就无法确定 ...

  2. 批梯度下降 随机梯度下降_梯度下降及其变体快速指南

    批梯度下降 随机梯度下降 In this article, I am going to discuss the Gradient Descent algorithm. The next article ...

  3. 梯度下降算法_梯度下降算法的工作原理

    ↑ 点击蓝字 关注极市平台作者丨 磐怼怼来源丨深度学习与计算机视觉编辑丨极市平台 极市导读 梯度下降算法是工业中最常用的机器学习算法之一,但也是很多新手难以理解的算法之一.如果你刚刚接触机器学习,那么 ...

  4. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法

    本文首发于我的微信公众号里,地址:梯度提升(Gradient Boosting)算法 本文禁止任何形式的转载. 我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI ...

  5. 梯度消失和梯度爆炸_梯度消失、爆炸的原因及解决办法

    一.引入:梯度更新规则 目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,更新优化深度网络的权值.这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来 ...

  6. 梯度消失和梯度爆炸_梯度消失梯度爆炸-Gradient Clip

    梯度爆炸与梯度消失 实际现象: 当我们使用sigmoid function作为激活函数时,随着神经网络的隐藏层数增加,训练误差反而增大,造成了深度网络的不稳定. 梯度弥散: 靠近输出层的hidden ...

  7. 梯度消失和梯度爆炸_梯度消失和梯度爆炸详解

    在中文搜索引擎搜索梯度爆炸或者梯度消失,出现的往往是一篇文章复制黏贴多次,而且这篇文章讲的并不清晰,比方说下面这种在文章中出现的图一,反正我是根本看不懂这张图描述的实什么,因此那篇被复制黏贴无数次的文 ...

  8. python怎么打日志_怎样调试 日志 python 代码

    展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...

  9. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用

    作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...

  10. python常用库教程_这几个python常用的库你必须知道!

    随着人工智能时代的到来,python变得更加流行.受欢迎,功能强大.简单易学.容易入门.应用广泛等,掀起了学习热潮,现在越来越多人转行都会学习python语言.为了让大家快速掌握python,今天为大 ...

最新文章

  1. linux 错误 too many open files 解决方案
  2. mac 终端快捷命令
  3. android之http协议编程(源码ppt),Android网络编程(八)源码解析OkHttp中篇[复用连接池]...
  4. 卸载重装svn后原来项目不受管理,版本不对应还是,升级工作副本解决?
  5. 使用postman创建Marketing Cloud的Contact
  6. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis
  7. 数据源管理 | 分布式NoSQL系统,Cassandra集群管理
  8. mybatis的mapper接口与xml传参问题
  9. ASP.NET通过OLE DB操作Excel
  10. 第二阶段冲刺报告(六)
  11. mysql触发器 多数据_mysql的触发器同数据库多表的数据操作_MySQL
  12. spring-boot-starter-thymeleaf对没有结束符的HTML5标签解析出错
  13. python中在一个脚本调用另一个脚本类中函数变量值
  14. Java判断合数或素数
  15. 常用地理信息数据下载平台
  16. 计算机网络 故障处理,浅析计算机网络常见故障处理及维护方法
  17. docker-comose入门到实战
  18. 借助Mendix打造敏捷开发和移动端应用的数字化维修服务平台
  19. 初识VB(一)——浏览文件并载入外部…
  20. 导线中电流分布和集肤深度

热门文章

  1. 8-20位大小写数字特殊符号三种及三种以上
  2. KNN算法解决鸢尾花分类案例
  3. jquery二维码生成插件_二维码生成器
  4. 地方政府公共服务注意力指标(100+关键词)2001-2021年
  5. Java——LRUCache
  6. 购买的的腾讯云服务器天天被ddos恶意攻击
  7. JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码
  8. 2021年RPA财务机器人应用到企业哪些场景?
  9. 有声音但没有小喇叭图标的原因
  10. 彩信发送流程 --- 之一