首页 > 其他分享 >梯度下降法及变式(代码实现)

梯度下降法及变式(代码实现)

时间:2024-04-05 21:11:52浏览次数:12  
标签:变式 梯度 batch alpha 法及 np theta grad size

梯度下降

BGD

def batchGradientDescent(x, y, theta, alpha, m, maxInteration):
    '''批梯度下降算法简单实现
    x: 输入
    y: 输出
    theta: w 和 b 组成的向量
    alpha: 学习率
    m: 批数据数量
    maxInteration:最大迭代次数
    '''
    x_train = x.transpose() # 转置
    for i in range(0, maxInteration):
        # 预测值
        hypothesis = np.dot(x, theta)
        # 预测误差
        error = hypothesis - y
        # 下降梯度
        gradient = np.dot(x_train, error) / m
        # 更新theta
        theta = theta - alpha * gradient
    return theta

SGD(Stochastic gradient descent)

def stochasticGradientDescent(x, y, theta, alpha, maxInteration):
    '''批梯度下降算法简单实现
    x: 输入
    y: 输出
    theta: w 和 b 组成的向量
    alpha: 学习率
    m: 批数据数量
    maxInteration:最大迭代次数
    '''
    data = []
    for i in range(4):
        data.append(i)
    for i in range(0, maxInteration):
        hypothesis = np.dot(x, theta)
        # 预测误差
        error = hypothesis - y
        # 选取一个随机数
        index = random.sample(data, 1)  # 从列表data中随机选取一个数据
        index1 = index[0]
        # 下降梯度
        gradient = error[index1] * x[index1]
        # 求导之后得到theta
        theta = theta - alpha * gradient
    return theta

MBGD

def miniBatchGradientDescent(x, y, theta, alpha, m, batch_size, epochs):
    '''
    x: 输入
    y: 输出
    theta: w 和 b 组成的向量
    alpha: 学习率
    m: 数据集的数据量
    batch_size:一个批次的数据量
    epochs:数据集最大迭代次数
    '''
    for epoch in range(epochs):
        # 生成索引列表
        indexs_list = np.arange(m)
        # 按批次迭代
        for batch in range(m // batch_size):
            # 生成批次数据索引
            index_list = indexs_list[batch*batch_size : batch*batch_size+batch_size]
            # 获取批次数据
            x_batch = x[index_list]
            y_batch = y[index_list]
            # 预测值
            hypothesis = np.dot(x_batch, theta)
            # 预测误差
            error = hypothesis - y_batch
            # 下降梯度
            gradient = np.dot(x_batch.T, error) / m
            # 更新theta
            theta = theta - alpha * gradient
    return theta

MSGD

def mini_batch_stochastic_gradient_descent(x, y, theta, alpha, m, batch_size, epochs):
    '''
    x: 输入
    y: 输出
    theta: w 和 b 组成的向量
    alpha: 学习率
    m: 数据集的数据量
    batch_size:一个批次的数据量
    epochs:数据集最大迭代次数
    '''
    for epoch in range(epochs):
        # 生成索引列表
        data_index = np.arange(m)
        # 打乱样本顺序
        np.random.shuffle(data_index)
        # 按批次迭代
        for batch in range(m // batch_size):
            # 生成批次数据索引
            batch_index = data_index[batch*batch_size : batch*batch_size+batch_size]
            # 获取批次数据
            x_batch = x[batch_index]
            y_batch = y[batch_index]
            # 预测值
            hypothesis = np.dot(x_batch, theta)
            # 预测误差
            error = hypothesis - y_batch
            # 下降梯度
            gradient = np.dot(x_batch.T, error) / m
            # 更新theta
            theta = theta - alpha * gradient
    return theta

Momentum

def momentum(x_start, step, g, discount = 0.7): 
    '''
    x_start: 是优化的起始点,即优化算法的初始参数
    step: 是学习率,用于控制参数更新的步长
    g: 是一个函数,用于计算参数 x 处的梯度
    discount: 是动量的衰减因子,默认值为 0.7
    '''
    x = np.array(x_start, dtype='float64')
    # 创建一个与参数 x 具有相同形状的零数组,用于存储上一步的		梯度信息
    pre_grad = np.zeros_like(x)
    for i in range(50):
        grad = g(x)
        pre_grad = pre_grad * discount + grad * step
        x -= pre_grad
        
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(sum(grad)) < 1e-6:
            break;
    return x

Nesterov

def nesterov(x_start, step, g, discount = 0.7):
   '''
   x_start: 是优化的起始点,即优化算法的初始参数
   step: 是学习率,用于控制参数更新的步长
   g: 是一个函数,用于计算参数 x 处的梯度
   discount: 是 Nesterov 加速梯度下降中的动量衰减因子,默认值	为 0.7
   ''' 
    x = np.array(x_start, dtype='float64')
    pre_grad = np.zeros_like(x)
    for i in range(50):
        # 预测未来的参数位置,利用当前参数 x 和动量信息来计	算。
        x_future = x - step * discount * pre_grad
        # 计算预测位置处的梯度
        grad = g(x_future)
        # 更新动量信息,结合上一步的动量信息和当前的梯度信息。
        pre_grad = pre_grad * 0.7 + grad 
        x -= pre_grad * step
        
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(sum(grad)) < 1e-6:
            break;
    return x
nesterov([150,75], 0.012, g)

RMSprop

Adam

标签:变式,梯度,batch,alpha,法及,np,theta,grad,size
From: https://www.cnblogs.com/0214jx/p/18116199

相关文章

  • 【故障诊断】用于轴承故障诊断的性能增强时变形态滤波方法及用于轴承断层特征提取的增
    ......
  • Python|梯度下降法
    全量梯度下降importnumpyasnp#创建数据集X,ynp.random.seed(1)X=np.random.rand(100,1)y=4+3*X+np.random.randn(100,1)X_b=np.c_[np.ones((100,1)),X]#创建超参数n_iterations=10000t0,t1=5,500#定义一个函数来动态调整学习率defl......
  • Java中常用的加密算法及其实现原理详解(二)
    本系列文章简介:        随着互联网的快速发展,信息的安全保护愈发重要。在软件开发中,加密算法被广泛应用于数据的加密和解密过程中,以保护敏感信息的机密性和完整性。Java作为一种广泛应用于企业级开发的编程语言,也提供了丰富的加密算法库。        本文将介绍......
  • 【前置知识】散度、梯度、旋度及其衍生
    在CFD理论研究中,以下的算符是不得不品的基础。下文整理在笛卡尔坐标系下,散度、梯度、旋度等一系列物理量。目录倒三角算符一阶梯度散度旋度二阶梯度的散度​编辑拉普拉斯算符散度的梯度爱因斯坦求和约定倒三角算符倒三角算符,称为nabla,哈密顿算子,又可称为del。......
  • 模2法及CRC校验码
    模2加减法低位补0,按位取反。 模2乘法 模2除法 CRC校验码数据信息(原始报文):1100,生成多项式X^3+X+1,多项式取指数位,对应2进制位(1011)原始报文+多项式最高位个0(1100_000)模2除多项式二进制(1011)余数(00010)取指数最高位(3位)为校验码(010)。CRC编码=原始报文+校验码=110......
  • 深度学习之详解常见梯度算法(概念、公式、原理、算法实现过程)
    目录前言一、如何实现梯度下降?二、梯度计算三、常见的梯度公式及梯度算法常见的梯度公式:1.标量对向量的梯度:2.标量对矩阵的梯度:3.向量对标量的梯度:常见梯度算法:四、常见梯度算法实现 1、批量梯度下降算法实现函数2、随机梯度下降算法实现函数 3、小批量梯度......
  • 吴恩达2022机器学习专项课程(一) 4.6 运行梯度下降&第一周课程实验:线性回归的梯度下降
    问题预览/关键词更新梯度下降对模型拟合,等高线图,3d空间图的变化。什么是批量梯度下降。实验目标计算梯度运行梯度下降梯度下降迭代次数和成本函数的关系可视化模型预测在等高线图上的梯度下降学习率过大报错问题笔记1.模型拟合,等高线图,3d空间图的变化3.5课节有一样的图,......
  • MySQL、Redis 和 Zookeeper 实现分布式锁方法及优缺点
    MySQL、Redis和Zookeeper都可以用来实现分布式锁,每种技术都有其特定的实现方法以及各自的优缺点。MySQL分布式锁实现方法在MySQL中实现分布式锁通常涉及到使用数据库表。可以创建一个专用的锁表,并利用行的唯一性(例如利用唯一索引)来实现锁机制。使用基于事务的 FORUP......
  • 部分数据类型的内置方法及字符串内置方法
    昨日内容回顾【一】循环结构【1】while循环break:退出当前循环coutinue:退出本次循环tag:标志位,可以通过最里层的标志位直接将最外层的while循环断掉【2】for循环遍历可迭代类型(可以被索引取值的都可以被迭代,可一个个取值的就是可迭代的)遍历的意思就是将被需要遍历的......
  • 用梯度下降法实现线性回归
    sklearn的SGDRegressor()函数用于实现梯度下降法的回归分析。#coding=utf-8#导入必要的库importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportlinear_model#设置文字plt.rcParams['font.sans-serif']='SimHei'#创建数据矩阵X,y=[],[......