python 字典集合散列表原理

Python字典与集合实战:从哈希表原理到高效数据处理 哈希表是计算机科学中实现高效查找与存储的核心数据结构,其通过哈希函数将键映射到存储位置,实现接近O(1)时间复杂度的查找、插入与删除操作。这一原理为Python中的字典与集合提供了强大的性能基础,使其成为处理映射关系、快速成员检测和集合运算的关键技术。在数据处理、缓存构建和算法优化等工程实践中,字典与集合的价值尤为突出,能够显著提升代码执行效率。例如,在数据统计场景中,字典可用于实现高效的词频计数;在关系运算中,集合能快速完成交集、并集等操作。本文聚焦于Python字典与集合的实战应用,通过典型练习题解析, 阅读详情

这一节笼统地描述了 Python 如何用散列表来实现 dict 类型,有些细节只是一笔带过。但是总体来说描述是准确的。

散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。在一般的数据结构教材中,散列表里的单元通常叫作表元(bucket)。在 dict 的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个是对值的引用。因为所有表元的大小一致,所以可以通过偏移量来读取某个表元。

因为 Python 会设法保证大概还有三分之一的表元是空的,所以在快要达到这个阈值的时候,原有的散列表会被复制到一个更大的空间里面。

如果要把一个对象放入散列表,那么首先要计算这个元素键的散列值。Python 中可以用hash() 方法来做这件事情,接下来会介绍这一点。

散列值和相等性

内置的 hash() 方法可以用于所有的内置类型对象。如果是自定义对象调用 hash() 的话,实际上运行的是自定义的 __hash__。如果两个对象在比较的时候是相等的,那它们的散列值必须相等,否则散列表就不能正常运行了。例如,如果 1 == 1.0 为真,那么 hash(1) == hash(1.0) 也必须为真,但其实这两个数字(整型和浮点)的内部结构是完全不一样的。

为了让散列值能够胜任散列表索引这一角色,它们必须在索引空间中尽量分散开来。这意味着在最理想的状况下,越是相似但不相等的对象,它们散列值的差别应该越大。下面示例是一段代码输出,这段代码被用来比较散列值的二进制表达的不同。注意其中 1 和1.0 的散列值是相同的,而 1.0001、1.0002 和 1.0003 的散列值则非常不同。
在这里插入图片描述
在这里插入图片描述
tips:
从 Python 3.3 开始,str、bytes 和 datetime 对象的散列值计算过程中多了随机的“加盐”这一步。所加盐值是 Python 进程内的一个常量,但是每次启动Python 解释器都会生成一个不同的盐值。随机盐值的加入是为了防止 DOS 攻击而采取的一种安全措施。在 __hash__ 特殊方法的文档(https://docs.python.org/3/reference/datamodel.html#object.__hash__) 里有相关的详细信息。

了解对象散列值相关的基本概念之后,我们可以深入到散列表工作原理背后的算法了。

散列表算法

为了获取 my_dict[search_key] 背后的值,Python 首先会调用 hash(search_key) 来计算search_key 的散列值,把这个值最低的几位数字当作偏移量,在散列表里查找表元(具体取几位,得看当前散列表的大小)。若找到的表元是空的,则抛出 KeyError 异常。若不是空的,则表元里会有一对 found_key:found_value。这时候 Python 会检验 search_key == found_key 是否为真,如果它们相等的话,就会返回 found_value。

如果 search_key 和 found_key 不匹配的话,这种情况称为散列冲突。发生这种情况是因为,散列表所做的其实是把随机的元素映射到只有几位的数字上,而散列表本身的索引又只依赖于这个数字的一部分。为了解决散列冲突,算法会在散列值中另外再取几位,然后用特殊的方法处理一下,把新得到的数字再当作索引来寻找表元。若这次找到的表元是空的,则同样抛出 KeyError;若非空,或者键匹配,则返回这个值;或者又发现了散列冲突,则重复以上的步骤。下图展示了这个算法的示意图。

图1:从字典中取值的算法流程图;给定一个键,这个算法要么返回一个值,要么抛出 KeyError 异常
在这里插入图片描述
添加新元素和更新现有键值的操作几乎跟上面一样。只不过对于前者,在发现空表元的时候会放入一个新元素;对于后者,在找到相对应的表元后,原表里的值对象会被替换成新值。

另外在插入新值时,Python 可能会按照散列表的拥挤程度来决定是否要重新分配内存为它扩容。如果增加了散列表的大小,那散列值所占的位数和用作索引的位数都会随之增加,这样做的目的是为了减少发生散列冲突的概率。

表面上看,这个算法似乎很费事,而实际上就算 dict 里有数百万个元素,多数的搜索过程中并不会有冲突发生,平均下来每次搜索可能会有一到两次冲突。在正常情况下,就算是最不走运的键所遇到的冲突的次数用一只手也能数过来。

了解 dict 的工作原理能让我们知道它的所长和所短,以及从它衍生而来的数据类型的优缺点。下面就来看看 dict 这些特点背后的原因。

dict的实现及其导致的结果

下面的内容会讨论使用散列表给 dict 带来的优势和限制都有哪些

1. 键必须是可散列的
一个可散列的对象必须满足以下要求。
(1) 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列值是不变的。
(2) 支持通过 __eq__() 方法来检测相等性。
(3) 若 a == b 为真,则 hash(a) == hash(b) 也为真。

所有由用户自定义的对象默认都是可散列的,因为它们的散列值由 id() 来获取,而且它们都是不相等的。

tips:
如果你实现了一个类的 __eq__ 方法,并且希望它是可散列的,那么它一定要有个恰当的 __hash__ 方法,保证在 a == b 为真的情况下 hash(a) == hash(b)也必定为真。否则就会破坏恒定的散列表算法,导致由这些对象所组成的字典和集合完全失去可靠性,这个后果是非常可怕的。另一方面,如果一个含有自定义的 __eq__ 依赖的类处于可变的状态,那就不要在这个类中实现__hash__ 方法,因为它的实例是不可散列的。

2. 字典在内存上的开销巨大
由于字典使用了散列表,而散列表又必须是稀疏的,这导致它在空间上的效率低下。举例而言,如果你需要存放数量巨大的记录,那么放在由元组或是具名元组构成的列表中会是比较好的选择;最好不要根据 JSON 的风格,用由字典组成的列表来存放这些记录。用元组取代字典就能节省空间的原因有两个:其一是避免了散列表所耗费的空间,其二是无需把记录中字段的名字在每个元素里都存一遍。

在用户自定义的类型中,__slots__ 属性可以改变实例属性的存储方式,由 dict 变成tuple,相关细节以后会说。

记住我们现在讨论的是空间优化。如果你手头有几百万个对象,而你的机器有几个 GB 的内存,那么空间的优化工作可以等到真正需要的时候再开始计划,因为优化往往是可维护性的对立面。

3. 键查询很快
dict 的实现是典型的空间换时间:字典类型有着巨大的内存开销,但它们提供了无视数据量大小的快速访问——只要字典能被装在内存里。如果把字典的大小从1000 个元素增加到 10 000 000 个,查询时间也不过是原来的 2.8 倍,从 0.000163 秒增加到了 0.00456 秒。这意味着在一个有 1000 万个元素的字典里,每秒能进行 200 万个键查询。

4. 键的次序取决于添加顺序
当往 dict 里添加新键而又发生散列冲突的时候,新键可能会被安排存放到另一个位置。于是下面这种情况就会发生:由 dict([key1, value1), (key2, value2)] 和 dict([key2, value2], [key1, value1]) 得到的两个字典,在进行比较的时候,它们是相等的;但是如果在 key1 和 key2 被添加到字典里的过程中有冲突发生的话,这两个键出现在字典里的顺序是不一样的。

示例展示了这个现象。这个示例用同样的数据创建了 3 个字典,唯一的区别就是数据出现的顺序不一样。可以看到,虽然键的次序是乱的,这 3 个字典仍然被视作相等的。

# -*- coding: utf-8 -*-
DIAL_CODES = [
    (86, 'China'),
    (91, 'India'),
    (1, 'United States'),
    (62, 'Indonesia'),
    (55, 'Brazil'),
    (92, 'Pakistan'),
    (880, 'Bangladesh'),
    (234, 'Nigeria'),
    (7, 'Russia'),
    (81, 'Japan'),
]
d1 = dict(DIAL_CODES)  # 创建 d1 的时候,数据元组的顺序是按照国家的人口排名来决定的。
print('d1:', d1.keys())
# d1: dict_keys([86, 91, 1, 62, 55, 92, 880, 234, 7, 81])

d2 = dict(sorted(DIAL_CODES))  # 创建 d2 的时候,数据元组的顺序是按照国家的电话区号来决定的
print('d2:', d2.keys())
# d2: dict_keys([1, 7, 55, 62, 81, 86, 91, 92, 234, 880])
d3 = dict(sorted(DIAL_CODES, key=lambda x: x[1]))  # 创建 d3 的时候,数据元组的顺序是按照国家名字的英文拼写来决定的
print('d3:', d3.keys())
# d3: dict_keys([880, 55, 86, 91, 62, 81, 234, 92, 7, 1])
print(d1 == d2 and d2 == d3)
# True

5. 往字典里添加新键可能会改变已有键的顺序
无论何时往字典里添加新的键,Python 解释器都可能做出为字典扩容的决定。扩容导致的结果就是要新建一个更大的散列表,并把字典里已有的元素添加到新表里。这个过程中可能会发生新的散列冲突,导致新散列表中键的次序变化。要注意的是,上面提到的这些变化是否会发生以及如何发生,都依赖于字典背后的具体实现,因此你不能很自信地说自己知道背后发生了什么。如果你在迭代一个字典的所有键的过程中同时对字典进行修改,那么这个循环很有可能会跳过一些键——甚至是跳过那些字典中已经有的键。

由此可知,不要对字典同时进行迭代和修改。如果想扫描并修改一个字典,最好分成两步来进行:首先对字典迭代,以得出需要添加的内容,把这些内容放在一个新字典里;迭代结束之后再对原有字典进行更新。

tips:
在 Python 3 中,.keys()、.items() 和 .values() 方法返回的都是字典视图。也就是说,这些方法返回的值更像集合,而不是像 Python 2 那样返回列表。视图还有动态的特性,它们可以实时反馈字典的变化。

set的实现以及导致的结果

set 和 frozenset 的实现也依赖散列表,但在它们的散列表里存放的只有元素的引用(就像在字典里只存放键而没有相应的值)。在 set 加入到 Python 之前,我们都是把字典加上无意义的值当作集合来用的。

在 上面所提到的字典和散列表的几个特点,对集合来说几乎都是适用的。为了避免太多重复的内容,这些特点总结如下。
• 集合里的元素必须是可散列的。
• 集合很消耗内存。
• 可以很高效地判断元素是否存在于某个集合。
• 元素的次序取决于被添加到集合里的次序。
• 往集合里添加元素,可能会改变集合里已有元素的次序。

Python dict和set的底层原理 0 前言 C++中的map和set都是使用红黑树来实现的,是一个排序的结构,插入,查找和删除都可以在logn的时间复杂度完成。另外C++中还提供了unordermap和unorderset数据结构,这两个数据结构是使用哈希表实现的,是没有排序,插入、查找和删除都可以在O(1)的时间复杂度内完成。 除了C++,Python也是我常用的一门编程语言,python提供了dict来存储键值对,相当于c++... 阅读详情

相关推荐

Python集合与字典深度解析:从哈希表原理到实战应用场景

在Python编程中,数据结构的选择直接影响代码的性能与可读性。哈希表作为一种基础数据结构,通过键的哈希值实现O(1)平均时间复杂度的快速查找,是理解高效数据存储与检索的核心原理。集合(set)与字典(dict)均基于哈希表实现,但设计目的迥异:集合专为处理元素唯一性和集合关系运算(如并集、交集)而优化,适用于数据去重和成员存在性检查;字典则专注于建立键到值的映射关系,是实现缓存、计数和配置管理的理想工具。掌握两者的底层逻辑与性能差异,能帮助开发者在数据去重、快速查找等高频场景中做出精准选择,从而编写出既高

weixin_26938645的博客 312

字典和集合2:高效性和可哈希

Python学习-字典和集合的高效性和可哈希

davidksatan的博客 421

【计算机组成原理实验】状态机实验

理解“状态机”概念,掌握“状态机”思想描述时序系统。通过下列三种基于D触发器的计数器结构,构建状态机的状态转移电路:环形计数器、扭环计数器和条件判断的扭环计数器。基于“状态机”原理,设计一个“交通灯”系统:控制红黄绿信号灯按照以下顺序循环点亮:“绿 黄 红 绿 ……”,红灯、绿灯和黄灯的亮灯持续时间可以通过拨码开关独立设置。红灯和绿灯是持续亮灯模式,黄灯则是闪烁亮灯模式。

Rover_jb的博客 1332

Python集合与字典深度解析:从哈希表原理到实战应用选择

在Python编程中,数据结构的选择直接影响代码的性能与可读性。哈希表作为一种基础且高效的数据组织方式,是实现O(1)平均时间复杂度查找的关键。其核心原理是通过哈希函数将键映射到存储位置,从而实现快速访问。这一技术价值在于,它能将数据检索效率从线性遍历的O(n)提升至近乎常数时间,尤其适用于大规模数据处理。在工程实践中,基于哈希表实现的内置数据结构——集合(set)与字典(dict),分别服务于不同的应用场景。集合专注于成员存在性检测和去重,而字典则擅长建立键值映射关系,两者共同构成了处理**快速查找**和

weixin_29291573的博客 301

网络工程系统CAD图:从设计到落地的关键技能与实战指南

网络工程并不只是配置路由器和交换机,真正的核心在于将设计方案转化为可施工的物理图纸。网络工程系统CAD图正是连接逻辑设计与物理世界的桥梁,它涵盖综合布线、信息点布置、桥架路由、弱电间规划等关键内容。理解并掌握这套图纸体系,是网络工程师从基础设备调试走向项目主导者、弱电总工乃至网络架构师的重要分水岭。在园区网、数据中心、智能楼宇等真实场景中,一套规范的系统CAD图直接决定了施工质量、验收效率与后期运维的可靠性。本文从基础概念出发,拆解图纸的组成层次、绘制流程和软件工作流,并结合学习路线与就业方向,帮助初学者建

weixin_33860553的博客 391

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1143

python进阶(第三章2)字典和集合

python进阶(第三章2)集合论

Jibert的博客 340

Docker部署 SRS rtmp/flv流媒体服务器

SRS(Simple Realtime Server)是一款开源的流媒体服务器,具有高性能、高可靠性、高灵活性的特点,能够支持直播、点播、转码等多种流媒体应用场景。SRS 不仅提供了流媒体服务器,还提供了适用于多种平台的客户端 SDK 和在线转码等辅助服务,是一款十分强大的流媒体解决方案。

m0_56659620的博客 4869

《流畅的Python》读书笔记04: 第一部分 数据结构 - 字典和集合

流畅的 Python》第 3 章深入讲解了 Python 中字典(dict)和集合(set)这两种重要的数据结构。字典是 Python 语言的基石——实例属性、模块命名空间、函数的关键字参数等,底层都用字典承载。即使程序中没有显式使用字典,任何运行的 Python 程序背后也活跃着多个字典实例。散列表(hash table,即哈希表)。字典和集合都基于散列表实现。理解散列表的工作原理,是真正掌握字典和集合性能特征、适用场景以及背后设计哲学的关键。常见的字典方法如何处理查找不到的键(

2634

修改yolov8使支持单通道图像输入

默认支持BGR三通道图像输入,但是在很多工业场景下,存在很多灰度图像的场景,因此对yolov8代码做一些修改以支持单通道图像输入,满足项目实际需求。训练时,只需要在 data 的 yaml 文件中,添加 ch=1 即可。

mingo_敏 5779

【AI智能体】Skills 智能体驱动开发从使用到项目实战详解

Skills 智能体驱动开发从使用到项目实战详解

congge 6610

Python 第九天:集合与字典-基于哈希表的实现

在 Python 中,通常使用**字典(dict)**实现映射这种数据结构。:字典中的键(Key)必须是不可变的数据类型,但值(Value)可以是任意数据类型。,即将一个元素(键/Key)与一个对应的值(Value)关联起来。还提供了一些常用方法,主要包括集合的。函数创建集合,或将列表转为集合。创建集合,元素之间使用逗号(包裹,每个键值对使用冒号()分隔,键值对之间使用逗号(除了以上两种常见操作,

xhy0987的博客 191

Unity之如何接入NPOI 快速读取Excel

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目

TxNet 4397

Python集合与字典深度解析:从哈希表原理到高效应用场景

哈希表作为计算机科学中的核心数据结构,通过哈希函数将键映射到存储位置,实现了近乎常数时间的查找、插入和删除操作,是构建高效数据存储与检索系统的基石。其技术价值在于以空间换时间,极大提升了程序处理大规模数据的性能。在Python中,哈希表的经典应用体现在两大内置数据结构:字典(dict)与集合(set)。字典基于哈希表实现键值映射,广泛应用于配置管理、缓存系统和数据分组;而集合本质上是仅保留键的哈希表,专注于成员关系测试和去重操作,常用于数据清洗和关系运算。本文聚焦于Python中这两大核心容器的底层实现差异

weixin_42542669的博客 219

下拉式菜单设计——Power BI

Power BI导航设计:多级下拉菜单

weixin_41542593的博客 5434

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

散列表的设计与实现_python基础之字典与集合实现

更多内容,欢迎关注微信公众号: tmac_lover上一篇介绍python中字典和集中时,提到,字典和集合的优势在于增删改查非常高效,而高效的原因就在于,python中字典和集合这两个数据结构是基于散列表 来实现的。散列表也叫哈希表,英文是hashtable。是一种非常高效的基础数据结构,今天我们介绍一下散列表的原理,了解了原理之后,就会很容易理解为什么 字典和集合的增删改查如此高效。什么是散列表...

weixin_36111677的博客 359

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python基础之Day4 python 的序列之字典与集合

contents序列字典字典的创建字典元素的访问字典元素的添加、修改、删除序列解包python实例字典核心底层原理 序列 字典 字典是“键值对”的无序可变序列。 通过键对象,快速获取、删除、更新对应的值对象(类似列表中的下标数字a[0]的0) 键为任意不可变数据,如正整数、浮点数,字符串 ,元组。 键不可重复 字典的创建 {}、dict()来创建字典 a={'name':'yueyue','age':18} b=dict(name='yueyue',age=18) c=dict([('name','

little_yueyue的博客 523

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python 字典和集合(dict和set的背后)

本章内容的大纲如下:常见的字典方法如何处理查找不到的键标准库中 dict 类型的变种set 和 frozenset 类型散列表的工作原理散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的顺序,等等)

钢铁男儿 1081

字典的底层实现

(哈希算法,哈希表,拉链法,开放寻址法) 字典是通过散列表或说哈希表实现的。字典也被称为关联数组,还称为哈希数组等 字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值 哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。Python中并不包含这样高级的哈希函数

continue_every的博客 813

python关键字集合_python-深度知识篇-字典(dict)与集合(set)

背景python的字典与集合是非常常用的数据结构,通过学习理解以下问题:如何才可以作为字典的key或集合里的元素?为什么不应该在迭代循环dict或set的同时添加元素了?字典是如何实现的?字典是无序的?散列表:根据关键字而直接进行访问的数据结构hash函数,内置的hash()方法,注意一点,如果两个对象比较的时候是相等的,那它们的散列值必须相等,否则散列表就不能正常运行。比如1 == 1.0 为真...

weixin_39558317的博客 199

python集合和字典的区别_Python中的字典和集合

导语:本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。本文重点:1、掌握常见的字典创建,查询,判别方法;2、了解字典中的defaultdict、子类化Userdict和常见映射类型;3、了解支撑字典和集合背后的散列表的工作原理。一、常见的字典方法1、创建方法分为字面量句法和构造方法两种,下面以{"one":1,"two":2...

weixin_39614637的博客 660

流畅的python读书笔记③:字典和集合

字典这个数据结构活跃在所有 Python 程序的背后,即便你的源码里并没有直接用到它。——A. M. Kuchling

fishfuck的博客 386

Python基础知识 2022-11-14 ★ 小结 43-50 字典_集合

字典, 集合

meeki_的博客 307

Python 字典和集合的的实现:散列表

字典和集合的效率高,和他背后的散列表是绕不开的。 散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。散列表的单元叫做表元bucket。在dict的散列表中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对于值的引用。因为表元的大小一致,所以可以通过偏移量来读取表元。python会保证大概有三分之一的表元是空的,快要达到这个阈值的时候,原有的散列表会被复制到一个更大的空间里面。 散列值的相等: 内置的hash()方法是调用对象的__hash__。如果两个对象比较

lijiachang8的博客 547

在python中、字典和集合都是用一对什么作为界定符_流畅的python读书笔记-第三章Python 字典与集合...

字典和集合标准库里的所有映射类型都是利用 dict 来实现的只有可散列的数据类型才能用作这些映射里的键(值不用)可散列一个对象是可散列的它的散列值是不变的对象需要实现 __hash__() 方法可散列对象还要有 __qe__() 方法字典推导DIAL_CODES = [(86, 'China'), (91, 'India'), (1, 'United States'), (62, 'Indones...

weixin_39825872的博客 939

字典和集合的相关知识梳理

字典和集合字典推导集合论集合字面量集合推导集合的操作dict和set的背后字典中的散列表散列冲突dict的实现及其导致的结果set的实现以及导致的结果 字典推导 列表推导和生成器表达式的概念就移植到了字典上,从而有了字典推导(后面还会看到集合推导)。 字典推导(dictcomp)可以从任何以键值对作为元素的可迭代对象中构建出字典。 >>> DIAL_CODES = [ #➊ ... (86, 'China'), ...

每天都要进步的博客 644
上一篇: python 集合详细
下一篇: python 一等函数基础
MZP_man
博客等级 码龄8年 188粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值