梯度上升和随机梯度上升

目录

梯度上升算法:

代码:

随机梯度上升算法:

代码:

实验:

做图代码:

疑问:

1.梯度上升算法不适应大的数据集,改用随机梯度上升更合适。

2.改进过的随机梯度算法,w vs epoch曲线出现波动。

代码实现时遇到的问题

1.对随机的理解,随机过的样本不再参与随机?

 2.数组越界

实验结果: 


Logistic回归实现二分类:http://t.csdnimg.cn/eEEjF

学习资料:Peter Harrington 机器学习实战

梯度上升算法:

如下,每更新一次权重需要计算所有样本(train_X)和权重乘积的sigmoid值。

对于m行n列特征矩阵和n行权重,迭代次数epoch,计算复杂度为O(n*m*epoch),w迭代次数为epoch.

代码:

def grad(train_X,train_y):
    # 100*3
    m,n = len(train_X[:,0]),len(train_X[0])
    #3x1 
    weight=np.ones((n,1))
    #迭代系数
    epoch=500
    for i in range(epoch):
        # mxn nx1 ->m*1
        y_=sigmoid(np.dot(train_X,weight))
        # m*1
        loss = train_y -y_
        a = 0.01
        # 3*1 
        weight = weight - np.dot(a*train_X.transpose(),loss)
    return weight

随机梯度上升算法:

每计算一次样本更新一次权重。

代码:

def grad(train_X,train_y):
    # 100*3
    m,n = len(train_X[:,0]),len(train_X[0])
    #3x1 
    weight=np.ones((n,1))
    # 每个样本更新权重一次,故使用m
    for i in range(m):
        # mxn nx1 ->m*1
        # y_=sigmoid(np.dot(train_X,weight))
        # 1xn nx1 -->1x1
        #(3,)表示只有一个维度,在这个维度上有三个数字
        y_=sigmoid(sum(np.dot(train_X[i].reshape(1,n),weight)))
        # 1x1
        loss = train_y[i] -y_
        a = 0.01
        # nx1 1xn 1x1 nx1 1x1
        weight = weight + a*np.dot(train_X[i].transpose().reshape(n,1),loss.reshape(1,1))
    return weight

使用这种方法实现的分类效果相较之前效果变差了,应该是w迭代次数不够,为了查看何时收敛,查看w和epoch的变化关系图。

梯度上升随机梯度上升

实验:

使用随机梯度算法:研究w和epoch的关系,epoch表示迭代数据集的次数.

ln(\frac{y}{1-y})=wx+b=w_{1}x1+w_{2}x2+b

w1,b,w2分别为权重为w[0],w[1],w[2]。

可以看出w0收敛很快,w1和w2需要更多时间才能实现收敛.

 

 

发现w大概到epoch=200处收敛,设置遍历数据集200次得到新图像基本和梯度算法基本一致:

做图代码:

def grad(train_X,train_y):
    # 100*3
    m,n = len(train_X[:,0]),len(train_X[0])
    #3x1 
    weight=np.ones((n,1))
    #迭代系数
    epoch=500
    w=[]
    # lineArr.append(float(currLine[i]))
    #100x100次
    for j in range(epoch):
        for i in range(m):
            # mxn nx1 ->m*1
            # y_=sigmoid(np.dot(train_X,weight))
            # 1xn nx1 -->1x1
            #(3,)表示只有一个维度,在这个维度上有三个数字
            y_=sigmoid(sum(np.dot(train_X[i].reshape(1,n),weight)))
            # 1x1
            loss = train_y[i] -y_
            a = 0.01
            # nx1 1xn 1x1 nx1 1x1
            weight = weight + a*np.dot(train_X[i].transpose().reshape(n,1),loss.reshape(1,1))
        w.append(weight)
    w0=[row[0] for row in w]
    w1=[row[1] for row in w]
    w2=[row[2] for row in w]
    epochlist =list(range(1,epoch+1,1))
    plt.plot(epochlist,w0)    

    plt.xlabel('gradw')
    plt.ylabel('epoch')
    plt.legend()
    plt.title("w[0] vs epoch")
    plt.show()

    plt.plot(epochlist,w1)    

    plt.xlabel('gradw')
    plt.ylabel('epoch')
    plt.legend()
    plt.title("w[1] vs epoch")
    plt.show()

    plt.plot(epochlist,w2)    

    plt.xlabel('gradw')
    plt.ylabel('epoch')
    plt.legend()
    plt.title("w[2] vs epoch")
    plt.show()
    return weight

疑问:

1.梯度上升算法不适应大的数据集,改用随机梯度上升更合适。

书中提到:数据量大的话不太方便,所以想到每计算一次样本更新一次权重,也就是随机梯度上升算法。但是计算每个样本迭代的权重,再遍历全部样本,不就是把矩阵乘法拆开算吗,我不理解,感觉没有提升运算效率的作用。

2.改进过的随机梯度算法,w vs epoch曲线出现波动。

我感觉这个第一个随机梯度上升法完全没有体现随机性,随机应该随机抽取训练集的的子集来更新回归系数吧。

 书里有提到随机梯度算法的改进:

2.1.学习率随着迭代次数增加应该减小,能缓解高频波动。(不过我的实验在第一个梯度上升没有出现高频波动,改进后反而出现了。)

2.2.随机抽取样本进行类别预测,loss计算和更新权重。

randIndex是0-len(dataIndex)的随机值;去掉dataIndex[randIndex]的值

但是这个randIndex和dataIndex为什么这么写,不太理解.

def grad(train_X,train_y):
    m,n = len(train_X[:,0]),len(train_X[0])

    weight=np.ones((n,1))
    epoch=50
    w=[]
    for j in range(epoch):
        #[0,1,2,,,m-1]对应train_X的索引
        dataIndex = list(range(m))
        for i in range(m):
            #随着迭代次数增加,减小学习率
            alpha = 4/(1.0+j+i)+0.0001 
            #在dataIndex中取随机样本的索引
            
            randIndex = int(random.uniform(0,len(dataIndex)))
           
            y_=sigmoid(sum(np.dot(train_X[randIndex].reshape(1,n),weight)))
            loss = train_y[i] -y_
            weight = weight + alpha*np.dot(train_X[i].transpose().reshape(n,1),loss.reshape(1,1))
            #去掉计算过的样本
            del(dataIndex[randIndex])
       
    return weight

代码实现时遇到的问题

1.对随机的理解,随机过的样本不再参与随机?

从dataIndex中随机取值,作为随机数;去掉dataIndex中被选过的值,即随机过的样本不再参与随机了。

randIndex = random.choice(dataIndex)
dataIndex.remove(randIndex)

 2.数组越界

代码错误:取0-len(dataIndex)的值作为索引,拿到randIndex的随机值;但是去掉索引为randIndex对应的值

dataIndex=[0,1,2,,,80] len=81 假设去掉了dataIndex[79]=79,

dataIndex=[0,1,2,,,78,80] len=80 取79 randIndex=dataIndex[79]=80 去掉randIndex[80]数组越界

就可能出现越界:

randIndex = dataIndex[int(random.uniform(0,len(dataIndex)))]
del(dataIndex[randIndex])

实验结果: 

w和epoch关系:

w1,w2收敛速度更慢了,w0的波动非常明显,感觉效果比改进前还差,这算法我学不明白。
 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算网关构建智慧楼宇新生态,打造未来建筑管理

边缘计算网关在无人值守环境中的应用十分广泛,尤其在智慧楼宇管理方面发挥着重要作用。它能够实现多个地点多楼宇之间的数据实时互通,通过边缘计算网关物联网应用构建智慧楼宇生态系统,解决传统楼宇管理网络布线、人员巡检以及后期运维等问题…

IoT DC3 是一个基于 Spring Cloud 全开源物联网平台 linux docker部署傻瓜化步骤

如有不了解可先参考我的另一篇文章本地部署:IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤 如有不了解可先参考我的另一篇文章本地部署: 1 环境准备: JDK 8 以上 docker 安装好 下载docker-compose-dev.yml 文件 执行基础环境docker安装 …

c++--运算符重载

1.重载的运算符 (1).重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。 (2).除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。 (3).对一个重载的运算符,其优先级和结合律与对应的内置运算符保持一致。 (4).当一个…

STM32通用定时器

本文实践:实现通过TIM14_CH1输出PWM,外部显示为呼吸灯。 通用定时器简介 拥有TIM2~TIM5、TIM9~TIM14 一共10个定时器,具有4路独立通道,可用于输入捕获、输出比 较,同时包含了基本定时去的所有功能。 通用定时器的结…

音视频技术开发周刊 | 322

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 超级AI不会主宰人类,但人工智能必须开源!LeCun最新采访引全网300万人围观 LeCun最新访谈视频中,再次坦露了自己对开源AI的看法。超级AI…

[MySQL--基础]多表查询

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录:生活中最大的挑战就是发现自己是谁。然后,坚定不移地成为那个人。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 MySQL数据库 多表查询 前言多表关系概述&#x1f…

怎么翻译英文医学文献资料

文献翻译是一项要求严谨、精确且地道的工作,对于医学文献翻译更是如此。那么,怎么翻译英文医学文献资料,医学英文文献翻译公司哪个好? 专业人士指出,在翻译医学文献时,理解原文的语境是至关重要的。这不仅需…

Vue JAVA开发常用模板

1.VsCode添加模板 左下角设置》用户代码片段 新建全局代码片段》将模板粘贴仅文件(prefix用于指定触发关键字) 添加成功过后输入配置的关键字即可使用 1.1 vue2模板 {// Example:"Print to console": {"prefix": "vue2",…

创建conan包-Understanding Packaging

创建conan包-Understanding Packaging 1 Understanding Packaging1.1 Creating and Testing Packages Manually1.2 Package Creation Process 本文是基于对conan官方文档Understanding Packaging翻译而来, 更详细的信息可以去查阅conan官方文档。 1 Understanding …

Leetcode刷题详解——等差数列划分

1. 题目链接:413. 等差数列划分 2. 题目描述: 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 …

24、到底什么是感受野?

在之前的文章中介绍卷积算法时,一直在强调一个地方,那就是卷积算法是——卷积核在输入图像上滑动扫描的过程。 在每一次扫描时,可以把卷积核的在长宽方向的大小看做一个窗口,透过窗口可以看到的输入图像的范围,就称为感受野。 也就是神经网络(卷积)在每一次扫描过程中…

RHEL8.9 静默安装Oracle19C

RHEL8.9 静默安装Oracle19C 甘肃圆角网络科技开发有限公司 说明(GUI):  1.实际业务场景中,Linux环境一般情况下是没有GUI的。没有GUI并不意味着没有安装图形界面。可能在部署Linux操作系统环境的时候安装了桌面环境,只是启动的时候设置了启动…

龙迅LT2611UX 四端口LVDS转HDMI(2.0)

1.描述: LT2611UX 四端口LVDS TO HDMI2.0。 LT2611UX是一款高性能得LVDS到HDMI2.0转换器得STB,DVD应用程序,LVDS输入可以配置单端口,双端口或者四端口,带有一个高速时钟通道,最多可运行三到四个高速数据…

FacetWP Relevanssi Integration相关性集成插件

点击阅读FacetWP Relevanssi Integration相关性集成插件原文 FacetWP Relevanssi Integration相关性集成插件是FacetWP与用于高级搜索的 Relevanssi 插件的集成显着增强了您网站的搜索功能。这个强大的工具使您的用户能够轻松找到他们寻求的特定内容,无论他们的查询…

【分布式算法】Raft算法详解

目录 一、什么是分布式一致性 二、Raft算法概述 三、Raft 算法的实现原理 3.1、Leader 选举 3.1.1、背景 3.1.2、有哪些成员身份 ​编辑 3.1.3、节点的状态转换 3.1.4、选举领导者的过程 3.1.5、节点间如何通讯? 3.1.6、什么是任期? 3.1.7、选…

SQL数据库知识点总结归纳

前后顺序可以任意颠倒,不影响库中的数据关系 关系数据库的逻辑性强而物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的数据关系 一名员工可以使用多台计算机(1:m),而一台计算机只能被一名员工使用(1:1),所以员工和计算机两个实体之间是一对多…

如何写出一个性能优化的单例模式

总结/朱季谦 单例模型是面试当中最常见的一种设计模式,它是一种对象创建模式,用于产生一个对象的具体实例,可以确保系统中一个类只产生一个实例。 简而言之,单例模式可以带来两个好处: 1、对于频繁使用到的对象&…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求:实现以下内容 远程控制: 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制: 1、查看本地(客户端)文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

MySQL笔记-第01章_数据库概述

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

n皇后问题的最优解及优化

n皇后问题的最优解 时间复杂度 package algorithm;public class NQueen {public static int num(int n){if(n < 1){return 0;}int[] record new int[n];//n皇后的n*n的棋盘&#xff0c;record[i]表示第i行的皇后放在了第几列return process(0,record,n);}/***返回n皇…