图文详解梯度下降算法的原理及Python实现

目录
  • 1.引例
  • 2.数值解法
  • 3.梯度下降算法
  • 4.代码实战:Logistic回归

1.引例

给定如图所示的某个函数,如何通过计算机算法编程求f(x)min?

2.数值解法

传统方法是数值解法,如图所示

按照以下步骤迭代循环直至最优:

① 任意给定一个初值x0

② 随机生成增量方向,结合步长生成Δx;

③ 计算比较f(x0)与f(x0+Δx)的大小,若f(x0+Δx)<f(x0)则更新位置,否则重新生成Δx;

④ 重复②③直至收敛到最优f(x)min。

数值解法最大的优点是编程简明,但缺陷也很明显:

① 初值的设定对结果收敛快慢影响很大;

② 增量方向随机生成,效率较低;

③ 容易陷入局部最优解;

④ 无法处理“高原”类型函数。

所谓陷入局部最优解是指当迭代进入到某个极小值或其邻域时,由于步长选择不恰当,无论正方向还是负方向,学习效果都不如当前,导致无法向全局最优迭代。就本问题而言如图所示,当迭代陷入x=xj时,由于学习步长step的限制,无法使f(xj±Step)<f(xj),因此迭代就被锁死在了图中的红色区段。可以看出x=xj并非期望的全局最优。

若出现下图所示的“高原”函数,也可能使迭代得不到更新。

3.梯度下降算法

梯度下降算法可视为数值解法的一种改进,阐述如下:

记第k轮迭代后,自变量更新为x=xk,令目标函数f(x)在x=xk泰勒展开:

f(x)=f(xk​)+f′(xk​)(x−xk​)+o(x)

考察f(x)min ,则期望f(xk+1)<f(xk),从而:

f(xk+1​)−f(xk​)=f′(xk​)(xk+1​−xk​)<0

若f′(xk)>0则xk+1<xk ,即迭代方向为负;反之为正。不妨设xk+1−xk=−f′(xk),从而保证f(xk+1)−f(xk)<0。必须指出,泰勒公式成立的条件是x→x0,故|f′(xk)|不能太大,否则xk+1与xk距离太远产生余项误差。因此引入学习率γ∈(0,1)来减小偏移度,即xk+1-xk=−γf′(xk​)

在工程上,学习率γ \gammaγ要结合实际应用合理选择,γ \gammaγ过大会使迭代在极小值两侧振荡,算法无法收敛;γ \gammaγ过小会使学习效率下降,算法收敛慢。

对于向量 ,将上述迭代公式推广为

xk+1​=xk​−γ∇xk​​

其中

为多元函数的梯度,故此迭代算法也称为梯度下降算法

梯度下降算法通过函数梯度确定了每一次迭代的方向和步长,提高了算法效率。但从原理上可以知道,此算法并不能解决数值解法中初值设定、局部最优陷落和部分函数锁死的问题。

4.代码实战:Logistic回归

import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
from Logit import Logit

'''
* @breif: 从CSV中加载指定数据
* @param[in]: file -> 文件名
* @param[in]: colName -> 要加载的列名
* @param[in]: mode -> 加载模式, set: 列名与该列数据组成的字典, df: df类型
* @retval: mode模式下的返回值
'''
def loadCsvData(file, colName, mode='df'):
    assert mode in ('set', 'df')
    df = pd.read_csv(file, encoding='utf-8-sig', usecols=colName)
    if mode == 'df':
        return df
    if mode == 'set':
        res = {}
        for col in colName:
            res[col] = df[col].values
        return res

if __name__ == '__main__':
    # ============================
    # 读取CSV数据
    # ============================
    csvPath = os.path.abspath(os.path.join(__file__, "../../data/dataset3.0alpha.csv"))
    dataX = loadCsvData(csvPath, ["含糖率", "密度"], 'df')
    dataY = loadCsvData(csvPath, ["好瓜"], 'df')
    label = np.array([
        1 if i == "是" else 0
        for i in list(map(lambda s: s.strip(), list(dataY['好瓜'])))
    ])

    # ============================
    # 绘制样本点
    # ============================
    line_x = np.array([np.min(dataX['密度']), np.max(dataX['密度'])])
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    plt.title('对数几率回归模拟\nLogistic Regression Simulation')
    plt.xlabel('density')
    plt.ylabel('sugarRate')
    plt.scatter(dataX['密度'][label==0],
                dataX['含糖率'][label==0],
                marker='^',
                color='k',
                s=100,
                label='坏瓜')
    plt.scatter(dataX['密度'][label==1],
                dataX['含糖率'][label==1],
                marker='^',
                color='r',
                s=100,
                label='好瓜')

    # ============================
    # 实例化对数几率回归模型
    # ============================
    logit = Logit(dataX, label)

    # 采用梯度下降法
    logit.logitRegression(logit.gradientDescent)
    line_y = -logit.w[0, 0] / logit.w[1, 0] * line_x - logit.w[2, 0] / logit.w[1, 0]
    plt.plot(line_x, line_y, 'b-', label="梯度下降法")

    # 绘图
    plt.legend(loc='upper left')
    plt.show()

到此这篇关于图文详解梯度下降算法的原理及Python实现的文章就介绍到这了,更多相关Python梯度下降算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python梯度下降算法的实现

    本文实例为大家分享了python实现梯度下降算法的具体代码,供大家参考,具体内容如下 简介 本文使用python实现了梯度下降算法,支持y = Wx+b的线性回归 目前支持批量梯度算法和随机梯度下降算法(bs=1) 也支持输入特征向量的x维度小于3的图像可视化 代码要求python版本>3.4 代码 ''' 梯度下降算法 Batch Gradient Descent Stochastic Gradient Descent SGD ''' __author__ = 'epleone' import

  • python实现梯度下降算法的实例详解

    python版本选择 这里选的python版本是2.7,因为我之前用python3试了几次,发现在画3d图的时候会报错,所以改用了2.7. 数据集选择 数据集我选了一个包含两个变量,三个参数的数据集,这样可以画出3d图形对结果进行验证. 部分函数总结 symbols()函数:首先要安装sympy库才可以使用.用法: >>> x1 = symbols('x2') >>> x1 + 1 x2 + 1 在这个例子中,x1和x2是不一样的,x2代表的是一个函数的变量,而x1代表

  • python梯度下降法的简单示例

    梯度下降法的原理和公式这里不讲,就是一个直观的.易于理解的简单例子. 1.最简单的情况,样本只有一个变量,即简单的(x,y).多变量的则可为使用体重或身高判断男女(这是假设,并不严谨),则变量有两个,一个是体重,一个是身高,则可表示为(x1,x2,y),即一个目标值有两个属性. 2.单个变量的情况最简单的就是,函数hk(x)=k*x这条直线(注意:这里k也是变化的,我们的目的就是求一个最优的   k).而深度学习中,我们是不知道函数的,也就是不知道上述的k.   这里讨论单变量的情况: 在不知道

  • python实现梯度下降法

    本文实例为大家分享了python实现梯度下降法的具体代码,供大家参考,具体内容如下 使用工具:Python(x,y) 2.6.6 运行环境:Windows10 问题:求解y=2*x1+x2+3,即使用梯度下降法求解y=a*x1+b*x2+c中参数a,b,c的最优值(监督学习) 训练数据: x_train=[1, 2], [2, 1],[2, 3], [3, 5], [1,3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7] y_train=[7, 8, 10,

  • python简单批量梯度下降代码

    简单批量梯度下降代码 其中涉及到公式 alpha表示超参数,由外部设定.过大则会出现震荡现象,过小则会出现学习速度变慢情况,因此alpha应该不断的调整改进. 注意1/m前正负号的改变 Xj的意义为j个维度的样本.下面为代码部分 import numpy as np #该处数据和linear_model中数据相同 x = np.array([4,8,5,10,12]) y = np.array([20,50,30,70,60]) #一元线性回归 即 h_theta(x)= y= theta0 +

  • python实现梯度下降算法

    梯度下降(Gradient Descent)算法是机器学习中使用非常广泛的优化算法.当前流行的机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现. 本文主要以线性回归算法损失函数求极小值来说明如何使用梯度下降算法并给出python实现.若有不正确的地方,希望读者能指出. 梯度下降 梯度下降原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快. 在线性回归算法中,损失函数为 在求极小值时,在数据量很小的时候,可以使用矩阵求逆的方式求最优的θ值.但当数

  • python实现梯度法 python最速下降法

    假设我们已经知道梯度法--最速下降法的原理. 现给出一个算例: 如果人工直接求解: 现给出Python求解过程: import numpy as np from sympy import * import math import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist # 定义符号 x1, x2, t = symbols('x1, x2, t') def func(): # 自定义一个函数 ret

  • 图文详解梯度下降算法的原理及Python实现

    目录 1.引例 2.数值解法 3.梯度下降算法 4.代码实战:Logistic回归 1.引例 给定如图所示的某个函数,如何通过计算机算法编程求f(x)min? 2.数值解法 传统方法是数值解法,如图所示 按照以下步骤迭代循环直至最优: ① 任意给定一个初值x0: ② 随机生成增量方向,结合步长生成Δx: ③ 计算比较f(x0)与f(x0+Δx)的大小,若f(x0+Δx)<f(x0)则更新位置,否则重新生成Δx: ④ 重复②③直至收敛到最优f(x)min. 数值解法最大的优点是编程简明,但缺陷也很

  • 图文详解牛顿迭代算法原理及Python实现

    目录 1.引例 2.牛顿迭代算法求根 3.牛顿迭代优化 4 代码实战:Logistic回归 1.引例 给定如图所示的某个函数,如何计算函数零点x0 在数学上我们如何处理这个问题? 最简单的办法是解方程f(x)=0,在代数学上还有著名的零点判定定理 如果函数y=f(x)在区间[a,b]上的图象是连续不断的一条曲线,并且有f(a)⋅f(b)<0,那么函数y=f(x)在区间(a,b)内有零点,即至少存在一个c∈(a,b),使得f(c)=0,这个c也就是方程f(x)=0的根. 然而,数学上的方法并不一定

  • 详解Bagging算法的原理及Python实现

    目录 一.什么是集成学习 二.Bagging算法 三.Bagging用于分类 四.Bagging用于回归 一.什么是集成学习 集成学习是一种技术框架,它本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务,一般结构是:先产生一组"个体学习器",再用某种策略将它们结合起来,目前,有三种常见的集成学习框架(策略):bagging,boosting和stacking 也就是说,集成学习有两个主要的问题需要解决,第一是如何得到若干个个体学习器,第二是如何选择一种结合策

  • 图文详解感知机算法原理及Python实现

    目录 写在前面 1.什么是线性模型 2.感知机概述 3.手推感知机原理 4.Python实现 4.1 创建感知机类 4.2 更新权重与偏置 4.3 判断误分类点 4.4 训练感知机 4.5 动图可视化 5.总结 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用.“深”在详细推导算法模型背后的数学原理:“广”在分析多个机器学习模型:决策树.支持向量机.贝叶斯与马尔科夫决策.强化学习等. 本期目标:实现这样一个效果 1.什么是线性模型 线性模型的假设形式是属性权重.偏置与属性

  • SSH原理及两种登录方法图文详解

    SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密. 传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知所有的客户端以及服务端都需要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全. 非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥以及私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险.

  • Android 图文详解Binder进程通信底层原理

    之前了解到进程与多进程,涉及多进程不可避免的遇到了进程间通信,说到进程间通信,Binder 成了一道绕不过的坎.接下来咱们逐一了解.

  • 图文详解go语言反射实现原理

    Go反射的实现和 interface 和 unsafe.Pointer 密切相关.如果对golang的 interface 底层实现还没有理解,可以去看我之前的文章: Go语言interface底层实现 , unsafe.Pointer 会在后续的文章中做介绍. (本文目前使用的Go环境是Go 1.12.9) interface回顾 首先我们简单的回顾一下interface的结构,总体上是: 细分下来分为有函数的 iface 和无函数的 eface (就是 interface{} ); 无函数的

  • Android Binder 通信原理图文详解

    目录 前言 1. Binder的作用 2. 进程与Binder驱动如何通信 3. ServiceManager进程的作用 Binder Client.Binder Server.ServiceManager关系 ServiceManager注册进Binder 4. 进程添加服务到ServiceManager的流程 其它进程找到SM 添加服务到ServiceManager BBinder作用 5. 进程从ServiceManager获取服务的流程 其它进程找到SM 从ServiceManager获

  • 图文详解Android属性动画

    Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)开始,Android开始支持属性动画,本文主要讲解如何使用属性动画.关于视图动画可以参见博文<Android四大视图动画图文详解>. 一.概述 视图动画局限比较大,如下所述: 1.视图动画只能使用在View上面. 2.视图动画并没有真正改变View相应的属性值,这导致了UI效果与实际View状态存在差异

  • Hadoop-3.1.2完全分布式环境搭建过程图文详解(Windows 10)

    一.前言 Hadoop原理架构本人就不在此赘述了,可以自行百度,本文仅介绍Hadoop-3.1.2完全分布式环境搭建(本人使用三个虚拟机搭建). 首先,步骤: ① 准备安装包和工具: hadoop-3.1.2.tar.gz ◦ jdk-8u221-linux-x64.tar.gz(Linux环境下的JDK) ◦ CertOS-7-x86_64-DVD-1810.iso(CentOS镜像) ◦工具:WinSCP(用于上传文件到虚拟机),SecureCRTP ortable(用于操作虚拟机,可复制粘

随机推荐