Redis系列(十九)、布隆过滤器(Bloom Filter)

Redis系列--布隆过滤器(Bloom Filter) 无论使用谷歌版本的布隆过滤器还是自己编写的,都会存在两个问题,1、因为不同元素经过hash函数计算后可能会出现相同的hash值(hash碰撞),就会出现一个误判率的问题2、因为有hash碰撞,导致同一个位置可能存放不同的数据,这对于删除操作是很不友好的。对于这些情况可查看另一种布隆过滤器,布谷鸟过滤器。 阅读详情

有没有想过,如果在redis内判断某个值是否存在,使用什么方式最快?使用Set的话当体量大的时候不仅查询慢,而且还占用非常大的空间,本篇就介绍一个即快速又节约空间的方式,使用布隆过滤器来判断某个值是否在集合内。

目录

介绍

安装

原理

布隆过滤器

空间占用

使用

应用场景


Redis6系列文章:

Redis系列(一)、CentOS7下安装Redis6.0.3稳定版

Redis系列(二)、数据类型之字符串String 

Redis系列(三)、数据类型之哈希Hash

Redis系列(四)、数据类型之列表List

Redis系列(五)、数据类型之无序集合Set

Redis系列(六)、数据类型之有序集合ZSet(sorted_set)

Redis系列(七)、常用key命令

Redis系列(八)、常用服务器命令 

Redis系列(九)、Redis的“事务”及Lua脚本操作

Redis系列(十)、详解Redis持久化方式AOF、RDB以及混合持久化

Redis系列(十一)、Redis6新特性之ACL安全策略(用户权限管理)

Redis系列(十二)、Redis6集群搭建及原理(主从、哨兵、集群)

Redis系列(十三)、pub/sub发布与订阅(对比List和Kafka)

Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)

Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

Redis系列(十六)、Redis6新特性之IO多线程

Redis系列(十七)、Redis中的内存淘汰策略和过期删除策略

Redis系列(十八)、Redis中的管道pipeline操作(Python)


介绍

布隆过滤器(Bloom Filter),是一个二进制向量和一系列随机映射函数实现。它是一种概率型数据结构,特点是高效、占用空间小,常用于判断某个元素是否在一个集合中,这个结果并不是完全准确的,它只能给一个概率性的结果,但只要正确的使用,在足够大体量的数据中这个概率几乎可以忽略不计。

安装

官网

在Github上下载最新版的源码包 下载RedisBloom_v2.2.3 :

Bloom_Github: https://github.com/RedisBloom/RedisBloom

Bloom_Python: https://github.com/RedisBloom/redisbloom-py

编译

进入RedisBloom源码包进行编译,编译完成后我们得到文件redisbloom.so:

tar -zxvf RedisBloom-2.2.3.tar.gz -C .
cd RedisBloom-2.2.3
make

安装 

为了方便管理Redis的模块,我在Redis目录下新建module目录并将刚才编译的文件复制到该目录下,然后安装该模块:

1. 创建模块目录并将编译的bloomfiler模块放进去
mkdir /opt/app/redis6/module
mv redisbloom.so /opt/app/redis6/module/

2安装Bloom Filter模块 有两种方式
#2.1 修改配置文件redis.conf,加上下面这行代码,使用绝对路径
loadmodule /opt/app/redis6/module/redisbloom.so

#2.2 也可以在启动Redis服务器的时候指定参数安装模块
redis-server --loadmodule /opt/app/redis6/module/redisbloom.so

3. 重启Redis服务器
systemctl restart redis

 

原理

布隆过滤器

每个布隆过滤器对应到Redis中就是一个位数组和几个不同的无偏型hash函数(无偏型是指把元素的hash值算的比较均匀),当我们向布隆过滤器中新增元素时,会调用这几个hash函数将算出来的几个整型索引值对应到位数组中的位置,将那几个位置的值标为1,默认该位数组上所有值都是0。

在判断元素是否在该集合中时,也是调用这几个hash函数将算出来的几个整型索引值对应到位数组中的位置,判断这几个位置是否全部为1,如果有不为1的值,那么该元素一定不在这个集合内,如果全部为1,则该元素可能存在于该集合内。

由上图可以看到,string_1,sting_2,string_3在被三个hash算法计算之后的结果会作为下标到位数组对应的位置将值更新为1,因此当我们想要判断string_1是否在集合中的时候,只需要判断位数组的下标位置2,5,7的值是否为1,当三个位置有不为1的值时,那么string_1一定不在该集合中,当三个值都为1的时候,string_1可能在集合中。这里为什么说可能呢? 举个例子:还是上面的图,string_1,string_2,string_3都在集合内,此时如果我想判断string_4(hash后的值为2,3,6)是否在集合中,可以看到位数组中下标为2,3,6的值都是1,因为被string_1,string_2,string_3的计算结果给更新过了,此时布隆过滤器给我们的结果是string_4在集合内,而我们知道string_4其实不在集合内的,所以这里是会有误判的存在。

这个误判的失败率跟hash算法的个数以及位数组的长度有关 ,数组越长、hash算法越多、插入元素越少,误判率就会越低。反之则误判率越高。而位数组长度越长或者hash算法越多,也会影响到空间效率和查询效率,因此我们需要根据实际需要合理的去使用布隆过滤器。

布隆过滤器可以判断某个元素一定不存在,但是无法判断它一定存在;

优点:

  • 空间效率高,空间占用小
  • 查询效率高

缺点:

  • 不能删除元素(已被更新为1的位数组中的位,不能再被更新为0)
  • 有误判率

空间占用

布隆过滤器有两个参数,第一个是预计元素的数量n,第二个是误判率p。公式根据这两个输入得到两个输出,第一个输出是位数组的长度m,也就是需要的存储空间大小(bit),第二个输出是hash函数的最佳数量k。hash函数的数量也会直接影响到误判率,最佳的数量会有最低的误判率。

计算公式:
k≈0.7*(m/n)    
p≈0.6185^(m/n)  

由上面的公式我们可以得到下面几个结论:

  1. 位数组m越长,误判率p就越低;
  2. 位数组m越长,hash函数最佳数量k就越多,影响计算效率;
  3. 当一个元素平均需要一个字节(8bit)空间时,即m/n=8,误判率大约2%;

因此我们可以大致估算出在不同的误判率p下,每个元素的平均占用空间m/n:

误判率p每个元素的平均占用(m/n)
0.0001%28.755bit
0.001%23.962bit
0.01%19.170bit

0.1%

14.377bit
1%9.585bit
10%4.792bit

即使在误判率P为百万分之一时,每个元素的占用也就29bit,就算存100万个元素,也不过消耗28MB的空间,由此可见,布隆过滤器的空间效率非常高,占用非常小。相比于直接存储在set中,无论是查询速度还是存储方式都更优秀。

如果想了解更多布隆过滤器的相关推导公式请参考:布隆过滤器 (Bloom Filter) 详解 

 

使用

我们可以在命令行或者其他语言的客户端使用,上面给出了python的客户端地址,我们也可以使用pip命令安装,这里演示命令行和python客户端的使用方式。

命令行:

#创建一个误判率0.1%,可存储1000个元素的布隆过滤器
bf.reserve my_cmd_filter 0.001 1000

#查看布隆过滤器
bf.info my_cmd_filter

#新增元素
bf.add my_cmd_filter wyk

#判断元素是否在集合内
bf.exists my_cmd_filter wyk

#批量新增元素
bf.madd my_cmd_filter2 m1,m2,m3

#批量判断元素是否在集合内
bf.mexists my_cmd_filter2 m1,m2,m9

Python:

#获取布隆过滤器连接
from redisbloom.client import Client
rb = Client(host='wykd', port=6379, db=0,password='wyk123456', decode_responses=True)


#创建一个0.1%误判率,可存放1000个元素的布隆过滤器
rb.bfCreate('my_filter', 0.001, 1000)

#给布隆过滤器新增元素
#若过滤器不存在则自动创建过滤器且默认为1%错判率,长度为100;
rb.bfAdd('my_filter','wyk') 
rb.bfAdd('my_filter','csdn')

#判断元素是否存在
res1=rb.bfExists('my_filter','wyk')
res2=rb.bfExists('my_filter','csdn')
res3=rb.bfExists('my_filter','noexist')

print(res1) #res:1
print(res2) #res:1
print(res3) #res:0

#批量新增元素
#若过滤器不存在则自动创建过滤器且默认为1%错判率,长度为100;
rb.bfMAdd('my_filter2','m1','m2','m3') 

#批量判断元素是否存在,返回列表
rb.bfMExists('my_filter2','m1','m2','m9') #res: [1,1,0]

应用场景

前面提到,布隆过滤器可以用于判断元素是否在集合内,经过合理的配置,布隆过滤器的常用场景有下面几种:

  • 爬虫避免爬到重复内容
  • 消息推送避免推送给相同的人
  • 刷抖音头条等信息流app时避免看到重复的内容
  • 解决缓存穿透等缓存问题;

另外除了布隆过滤器(Bloom Filter),redisbloom中还有三种过滤算法Cuckoo Filter、Count-Min Sketch、Top-K,其中布谷过滤器(Cuckoo Filter)可以解决布隆过滤器无法删除的缺点。有兴趣的同学可以深入了解一下。

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

 

铁路余票系统设计:高并发下的强一致性与分片锁优化 余票查询是典型高并发、强一致性、时空动态的分布式库存场景,其本质是‘读多写频+状态强校验’的复合型数据服务。不同于电商秒杀或普通缓存库存,铁路余票需同时满足毫秒级响应、座位级精确扣减、15天预售期多维切片等硬性约束。技术实现上,必须突破传统缓存预热与单表锁的局限,转向布隆过滤拦截、四维逻辑分片、五元组行级锁、核心事务瘦身等组合策略。本文聚焦真实春运级压力下的余票库落地实践,涵盖MySQL深度调优、Redis三级缓存协同、分库分表平滑扩容及渠道调度解耦等关键路径,为高确定性分布式库存系统提供可复用的工程范式。 阅读详情

相关推荐

Redis之布隆过滤器(Bloom Filter)

在使用Redis作为缓存服务的时候存在缓存穿透问题,可以使用布隆过滤器解决这样的问题,那么什么是布隆过滤器,如何在代码中使用?本文就主要解决这些问题。

技术分享 1919

Redis-布隆过滤器

布隆过滤器,海量数据去重、过滤的不二之选

xiaoyuanbama的博客 1273

【Redis】布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。可以把布隆过滤器理解为一个set集合,我们可以通过add往里面添加元素,通过contains来判断是否包含某个元素。

weixin_44823875的博客 2873

Redis 布隆过滤器的相关命令的使用

因为平常使用 Docker 比较多,所以照常还是使用Docker来准备环境啦。

qq_66627105的博客 1298

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南01

高并发:限流、熔断、降级高性能:红包拆分、多级缓存、大Key/热Key拆分、Pipeline、线程池、RocketMQ零丢失、幂等、分布式锁、集群缩容、分批入库海量数据处理:日志分表分片、跨表查询、冷热分层、大数据引擎服务器选型系统安全:网关安全、服务器安全、云存储安全、风控、监控、测试数据一致性:缓存与数据库一致性、大厂方案、蓝绿回滚、流量一致性、流程一致性项目与团队管理:流程问题、管理问题(风险、成本、人员、文档、培训)稳定性建设:上线三板斧、线上五步闭环、混沌工程、容量规划。

weixin_49199313的博客 249

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

python或Redis实现简单布隆过滤器 BloomFilter

## 简介 通过较少的空间,不存储数据本身而存储通过hash函数映射的位向量表,以此作为判断一个值是否存在的依据。BloomFilter只能确保一个值一定不存在,判断存在的情况由于位向量表有限以及hash表也可能产生冲突,并不准确,有一定误判的几率。 ![布隆过滤器](https://z3.ax1x.com/2021/08/09/f8mwX6.md.png) 红色和蓝色是成功添加了的数据,经过多个哈希函数映射后,位向量中对应的位被置为1。 需要判断黄色是否已经存在,经过同样多个hash函..

milanla的博客 1252

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 406

redis8.0新特性:布隆过滤器(Bloom Filter)详解

布隆过滤器的概念就不重复啰嗦了(数据不存在则一定不存在,数据存在不一定不存在)。redis8.0以前使用布隆过滤器是很麻烦的,基本上需要基于BitMap/BitSet自定义封装。Redis8.0将布隆过滤器功能内置了,使用redis客户端可以直接使用布隆过滤器了。

秃了也弱了 2325

ROS入门必学导航算法——Navigation

该平台集成了多款无人车底盘,包括履带式、四轮差速、阿克曼、麦克纳姆轮底盘等,以满足不同形式和配置的需求,并搭载了RTK定位系统、双目相机、深度相机和激光雷达等多种传感器,以满足开发者的科研需求。amcl节点接收里程计数据(通过"odom"话题)和激光雷达数据(通常通过"scan"话题),结合已知的地图,实时地估计出机器人在该地图上的位置。在ROS中,这是通过"tf库"变换实现的,通过将传感器数据转换到共同的参考系中,系统可以更容易地集成来自不同传感器的数据,并确保它们在相同的空间和时间范围内可用。

AMOVLAB(阿木实验室) 2909

最优控制理论 二+、哈密尔顿函数法的补充

本章基于变分法所推出的哈密尔顿函数法,2、讨论了积分方程约束的转化、控制+状态等式约束的一阶必要条件。3、控制分段连续、状态存在内点约束等情况下的角点条件,给出了协态变量和哈密尔顿函数在内点处不连续的表达式。...

MSysの优快云 9394

Bitmap,布隆过滤器初步了解

优点缺点使用场景可作为简单的布尔过滤器来判断用户是否执行过某些操作;可以计算用户日活、月活、留存率的统计;可以统计用户在线状态和人数;哈希函数的特点优点缺点有一定的误判率一般情况下不能从布隆过滤器中删除元素。引入依赖 yml配置 guava布隆过滤器配置类 redisson布隆过滤器配置类 redisson配置 redis配置类 utils controller jmeter进行调起测试 结果

LuckFairyLuckBaby的博客 1389

智能座舱架构与芯片- (9) 音频篇 上

从A2B收发器衍生出来的简化产品具备各种级别的功能,例如端点从节点(不支持TDM)、简化型主节点(支持较短的电缆和更少的从节点数量),以及简化型端点从节点(支持较短电缆和更少的PDM输入)。例如,AVB中的talker和listener是不同的设备,它们的参考时钟源可能并不相同。传统的车载收音机通过天线接收无线电信号,然后由调谐模块(Tuner)进行信号调谐,信道过滤,信道均衡,多路改善,信号解调等,转为数字信号后再交给DSP进行立体声解码,噪声抑制,弱信号处理,最后从车载音响系统进行播放。

joanna_xiao的博客 4908

redis布隆过滤器(Bloom)详细使用教程

的过滤器,这个过滤器的配置都是一些基础的配置,比如初始容量是100 错误率是0.01也就是百分之一的错误率,这个过滤明显不能满足我们的需要因为过滤器的工作原理就是通过多个哈希函数对key进行计算然后记录下来,那么容量就决定了在计算的过程中发生碰撞的概率大小了,所以我们在使用的时候一定要去手动创建过滤器以确保满足自己的需要。它以较小的空间占用和高效的查询时间著称。解释一下:bf.add 是安装布隆过滤器后才可以使用的命令,这是添加一个key的命令,user是过滤器的名字,而tese就是我们要去添加的key。

鹏鹏2077 6592

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1450

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 429

python模块之redisbloom redis布隆过滤器

RedisBloom 是一个 Redis 模块,提供了布隆过滤器(Bloom Filter)、计数器(Count-Min Sketch)、Top-K(Top-K)、Top-K with expiry(Top-K with Expiration)和多样本(Cuckoo Filter)等数据结构的实现。它通过将这些数据结构存储在 Redis 中,为应用程序提供了高效的数据处理和查询功能。布隆过滤器(Bloom Filter):布隆过滤器是一种高效的数据结构,用于快速判断一个元素是否存在于集合中。

老衲爱洗头的博客 1065

Qt C++ HTTP 调用通义千问大模型 X 学术论文润色工具(SCI 格式适配)

请求地址:`https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation`;| Windows | 打包时携带 `Qt6Network.dll`/`libcrypto-1_1-x64.dll` 等依赖;| Linux | 安装 `libssl-dev` 和 `libcurl4-openssl-dev`;| API 调用失败 | 检查 API-KEY 是否有效;

寒寒豆豆软件公司的博客 104

【Redis篇】详解布隆过滤器(原理 | 操作 | 代码)

当我们要删除“hello”这个数据的时候,我们会删除存储“hello”这个数据的hash值的位置,由于“hello”和“你好”存储在同一位置,这样子会造成误删。综上所述,布隆过滤器具有高效的查询性能、较低的存储需求、支持高并发访问、可扩展性强和简单高效的实现等优点,使其成为解决大规模数据查询和去重等问题的有效工具。,当我们查询“你好”的时候,由于 假设“你好”和“hello”这2个数据的hash值一样,会造成误判。因为布隆过滤器就是一个二进制数据的集合,当有一个数据加入到这个集合的时候,会经过下面的步骤。

小吉妙妙屋 2300

基于Simulink的电机驱动逆变器仿真

本文完成了电机驱动逆变器的Simulink多层级仿真平台搭建,实现了:✅ 构建了从理想到器件级的逆变器模型体系✅ 实现了Si/SiC损耗精确计算与结温预测✅ 建模了母线寄生参数、死区效应、栅极驱动等关键非理想特性✅ 支持故障注入与保护策略验证✅ 集成了热管理、EMI、寿命预测与碳足迹评估。

amy_mhd的博客 87

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

Redis数据类型--布隆过滤器类型详解及应用

概述:布隆过滤器(Bloom Filter)是 1970 年由布隆提出的,Redis 4.0版本已插件的形式引入到Redis中,布隆过滤器是一种占用空间非常小的概率数据结构,效率高,有一定的误判率,而且无法删除元素,主要用于去重场景。Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。如有不正确的地方请各位指出纠正。

weixin_42118323的博客 917

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis-布隆过滤器(Bloom Filter)详解

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小,但是有一定的误判率且无法删除元素。它实际上是一个很长的二进制向量和一系列随机映射函数组成,主要用于判断一个元素是否在一个集合中。

小强快跑~~ 5035

深度学习工具包 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")

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Redis(十) 布隆过滤器

1

weixin_43189971的博客 3269

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

redis使用布隆过滤器

介绍布隆过滤器以及用法,项目中如何使用,如何解决redis穿透

sora33的博客 1万+
上一篇: Redis系列(十八)、Redis中的管道pipeline操作(Python)
下一篇: Redis系列(二十)、缓存穿透、击穿、雪崩、预热、更新、降级
王义凯_Rick
王义凯_Rick 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄14年 858粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王义凯_Rick

遇见即是缘,路过就给个评论吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值