Python机器学习之随机梯度下降法的实现

 更新时间:2023年02月27日 09:25:59   作者:街 三 仔  
如果当我们数据量和样本量非常大时,每一项都要参与到梯度下降,那么它的计算量时非常大的,所以我们需要采用随机梯度下降法。本文介绍了Python实现随机梯度下降法的方法,希望对大家有所帮助

随机梯度下降法

为什么使用随机梯度下降法?

如果当我们数据量和样本量非常大时,每一项都要参与到梯度下降,那么它的计算量时非常大的,所以我们可以采用随机梯度下降法。

随机梯度下降法中的学习率必须是随着循环的次数增加而递减的。如果eta取一样的话有可能在非常接近我们的最优值时会跳过,所以随着迭代次数的增加,学习率eta要随之减小,我们可以用模拟退火的思想实现(如下图所示),t0和t1是一个常数,定值,其通常是根据经验取得一些值。

随机梯度下降法的实现

随机梯度下降法的公式如下图所示,其中挑出一个样本出来计算。

先创建x,y,以下取10000个样本

import numpy as np

m = 10000

x = np.random.random(size=m)
y = x*3 + 4 + np.random.normal(size=m)

写入函数

def dj_sgd(theta, x_i, y_i): # 传入一个样本,获取对应的梯度
    return x_i.T.dot(x_i.dot(theta)-y_i)*2 # MSE

def sgd(X_b, y, initial_theta, n_iters): # 求出整个theta的函数
    def learning_rate(i_iter):
        t0 = 5
        t1 = 50
        return t0/(i_iter+t1)
    theta = initial_theta
    i_iter = 1
    
    while i_iter <= n_iters:
        index = np.random.randint(0, len(X_b))
        x_i = X_b[index]
        y_i = y[index]
        gradient = dj_sgd(theta, x_i, y_i) # 求导数
        theta = theta - gradient*learning_rate(i_iter) # 求步长
        i_iter += 1
    return theta

调用函数,求出截距和系数

以上随机梯度的缺点是不能照顾到每一点,因此需要进行改进。

以下对其中的函数进行修改。

def dj_sgd(theta, x_i, y_i): # 传入一个样本,获取对应的梯度
    return x_i.T.dot(x_i.dot(theta)-y_i)*2 # MSE

def sgd(X_b, y, initial_theta, n_iters): # 求出整个theta的函数
    def learning_rate(i_iter):
        t0 = 5
        t1 = 50
        return t0/(i_iter+t1)
    theta = initial_theta
    m = len(X_b)
    
    for cur_iter in range(n_iters): # 每一次循环都把样本打乱,n_iters的代表整个样本看几轮
        random_indexs = np.random.permutation(m)
        X_random = X_b[random_indexs]
        y_random = y[random_indexs]
        for i in range(m):
            theta = theta - learning_rate(cur_iter*m+i) * (dj_sgd(theta, X_random[i], y_random[i]))
        return theta

与前边运算结果进行对比,其耗时更长。

到此这篇关于Python机器学习之随机梯度下降法的实现的文章就介绍到这了,更多相关Python随机梯度下降法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)

    python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、j

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。这篇文章主要介绍了python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换) ,需要的朋友可以参考下
    2019-04-04
  • Python Process多进程实现过程

    Python Process多进程实现过程

    这篇文章主要介绍了Python Process多进程实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python编程基础之类和对象

    Python编程基础之类和对象

    这篇文章主要为大家详细介绍了Python的类和对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 浅谈Python项目的服务器部署

    浅谈Python项目的服务器部署

    这篇文章主要介绍了Python项目的服务器部署,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • pandas to_excel 添加颜色操作

    pandas to_excel 添加颜色操作

    这篇文章主要介绍了pandas to_excel 添加颜色操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 深度解析Python线程和进程

    深度解析Python线程和进程

    这篇文章主要介绍了Python线程和进程的相关知识,包括线程与进程的区别,通过示例代码介绍了进程与线程的操作方法,需要的朋友可以参考下
    2022-04-04
  • Python读取多列数据以及用matplotlib制作图表方法实例

    Python读取多列数据以及用matplotlib制作图表方法实例

    这篇文章主要给大家介绍了关于Python读取多列数据以及用matplotlib制作图表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 图文详解宝塔centos7安装Conda的步骤

    图文详解宝塔centos7安装Conda的步骤

    在centos7上安装anaconda碰到很多的坑,分享出来,也免得以后自己忘记,下面这篇文章主要给大家介绍了关于宝塔centos7安装Conda的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Python实现小数转化为百分数的格式化输出方法示例

    Python实现小数转化为百分数的格式化输出方法示例

    这篇文章主要介绍了Python实现小数转化为百分数的格式化输出方法,结合具体实例形式分析了Python实现小数转换为百分数输出的相关操作技巧与注意事项,需要的朋友可以参考下
    2017-09-09
  • OpenCV中图像通道操作的深入讲解

    OpenCV中图像通道操作的深入讲解

    图像处理管道是一组按预定义顺序执行的任务,用于将图像转换为所需的结果或提取一些有趣的特征,下面这篇文章主要给大家介绍了关于OpenCV中图像通道操作的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论