关系数据库是如何工作的(8)

8、关系数据库基础入门 本文详细介绍了关系数据库的基础知识,包括关系数据库的基本概念和不同视角下的理解方式。内容涵盖了表、行、列、键、索引、约束等核心概念,以及数据库的常用操作、设计原则和性能优化方法。通过学习,读者可以掌握关系数据库的核心理论和实际应用技巧,为设计和管理高效稳定的数据库系统打下坚实基础。 阅读详情

日志管理器

我们已经认识到,为了提高性能,数据库将数据存储在内存缓冲区中。但是,如果在事务提交时,服务器崩溃,你就会丢失所有内存中的数据,这将导致事务持久性问题。

你可以将所有数据写入磁盘,但是,如果服务器崩溃,你可能只写入一半数据,这会导致事务的原子性问题。

事务所做的任何修改写入必须要全部撤销或全部写入。

为解决这一问题,有两种解决方案:

  • 影子拷贝/页 :每一个事务创建自己的数据库拷贝(或者是数据库的一部分),在这个拷贝上面工作。如果发生了错误,移除该拷贝;如果成功,数据库立刻将数据通过文件系统技巧从拷贝切换,并移除“旧的”数据。
  • 事务日志 :事务日志是一段存储空间。在每个写入磁盘操作之前,数据库将信息写入事务日志,以便在事务崩溃/撤销时,数据库能够知道如何移除(或完成)未完成的事务。

WAL

当大型数据库需要很多事务时,影子拷贝/页会占用大量磁盘空间。这就是现代数据库使用 事务日志 的原因。事务日志必须存储在 稳定的存储 中。我不会深入介绍存储技术,只简单提一句,使用(至少)RAID 磁盘阵列能够有效防止磁盘失败。

很多数据库(包括 Oracle、 SQL Server 、 DB2 、 PostgreSQL 、MySQL 和  SQLite )使用 预写式日志(Write-Ahead Logging protocol,WAL) 。WAL 包括三个规则:

  • 1) 数据库每一条修改都要产生一条日志记录, 这个日志记录必须在数据写入磁盘之前先写入事务日志
  • 2) 日志记录必须按照顺序写入:如果日志记录 A 发生在日志记录 B 之前,那么 A 必须在 B 之前写入
  • 3) 当事务提交时,直到事务成功结束,提交顺序必须写入事务日志

这个工作是由日志管理器完成的。简单来说,日志管理器就是,在缓存管理器和数据访问管理器(数据访问管理器将数据写入磁盘)之间,在数据写入磁盘之前,将每一个更新/删除/创建/提交/回滚写入事务日志。很简单,是不是?

不对! 经过这么多的学习,你应该知道,关于数据库的一切都可能引起“数据库效应”。严肃地说,日志管理器的问题是,找到一种既能写入日志,又能保持好性能的方式。如果写入事务日志太慢,它就会拖慢所有事情。

ARIES

1992 年,IBM 的研究者“发明了”一种改进版本的 WAL,称为 ARIES。ARIES 多多少少被大多数现代数据库使用。具体逻辑可能不一样,但是 ARIES 背后的概念已经被广泛使用。我给发明这个词加了引号,是因为根据 MIT 课程 ,IBM 研究者“什么都没干,只是写了篇事务恢复的最佳实践”。因为 ARIES 论文发表的时候,我只有 5 岁,我不关心那些尖酸刻薄的研究者们的流言蜚语。事实上,我之所以在这里写出来这个,主要是为了在我们开始最后一个技术部分之前稍微休息一下。我阅读了大量 关于 ARIES 的研究论文 ,发现它的确很有趣!在这部分我只介绍 ARIES 的大概,但是如果你想学习点真正的知识的话,我强烈推荐你去阅读这些论文。

ARIES 是 A lgorithms for R ecovery and I solation E xploiting S emantics(利用语义的恢复和隔离算法)的缩写。

这项技术的目的有两个:

  • 1) 获得 写日志的良好性能
  • 2) 获得快速 可靠的恢复

数据库之所以要回滚事务,其原因是多方面的:

  • 因为用户取消了事务
  • 因为服务器或网络失败
  • 因为事务打破了数据库完整性(例如,你有一个带有 UNIQUE 约束的列,而事务视图插入重复值)
  • 因为死锁

有时(比如网络失败)数据库能够从事务恢复。

这是怎么做到的?为回答这个问题,我们需要理解存储在日志记录中的信息。

日志

每一个 事务中的操作(增加/删除/修改)都会产生一条日志 。这个日志记录包括:

  • LSN : L og S equence N umber(日志顺序数)。LSN 按照顺序以此给出*。这意味着如果一个操作 A 发生在操作 B 之前,那么日志 A 的 LSN 就会比 日志 B 的 LSN 小。
  • TransID :产生操作的事务 ID。
  • PageID :被修改的数据在磁盘的位置。磁盘上数据的最小值是页,因此数据的位置也就是包含了数据的页的位置。
  • PrevLSN :同一事务产生的前一个日志记录的链接。
  • UNDO :移除该操作影响的方法。例如,如果操作是更新,UNDO 会保存元素被更新之前的值/状态(物理 UNDO)或者回到之前状态的撤销操作(逻辑 UNDO)**。
  • REDO :重现操作的方法。类似地,有两种方法保存 REDO:保存操作之后元素的值/状态或者可以重复执行的操作本身。
  • …:(顺便说一句,ARIES 日志还有另外两个字段:UndoNxtLSN 和 Type)。

另外,磁盘上每一个页(保存数据的页,不是保存日志的页)都保存有最后修改数据的那个操作的日志记录 ID(LSN)。

*这种给出 LSN 的方式更复杂一些,因为它与保存日志的方式相关。但思路是一致的。

**ARIES 只使用逻辑 UNDO,因为物理 UNDO 会有很大的消耗。

注意:就我所知,只有 PostgreSQL 没有使用 UNDO,而是使用了一个垃圾回收守护进程来移除旧的数据。这与 PostgreSQL 使用的数据版本实现相关。

为了更好理解,下面是日志记录的简单的图形化例子。这个日志记录来自于查询 “UPDATE FROM PERSON SET AGE = 18;”。假设该查询在事务 18 中执行。

每个日志都有唯一的 LSN。同一事务的日志被链接到一起。日志是顺序相连的(链表中的最后一个日志对应着最后一个操作)。

日志缓冲

为避免写入日志带来的主要瓶颈,数据库会使用 日志缓冲 。

当查询执行器请求修改时:

  • 1) 缓存管理器在其缓冲区保存修改
  • 2) 日志管理器在其缓冲区保存相关日志
  • 3) 在这一步,查询执行器认为操作已经完成(因此开始请求另外的修改)
  • 4) 然后(之后),日志管理器在事务日志写入日志。何时写入日志是由算法决定的。
  • 5) 然后(之后),缓存管理器将修改写入磁盘。何时写入数据是由算法决定的。

事务提交,意味着事务中的每一个操作,上述 1,2,3,4,5 步已经完成。写入事务日志是很快的,因为这仅仅是“在事务日志某个地方加入一条记录”;但是,将数据写入磁盘就复杂得多,因为“需要按照能够快速读取的方式写入数据”。

STEAL 和 FORCE 策略

由于性能原因, 第 5 步可能会在事务提交之后完成 ,因为如果万一崩溃,还有机会按照 REDO 日志。这被称为  NO-FORCE 策略 。

数据库也可以选择 FORCE 策略(也就是说,第 5 步必须在提交之前完成)降低恢复期间的工作负载。

另一个问题是, 数据是一步一步写入磁盘的(STEAL 策略) 还是缓冲管理器需要等待提交命令,一次性写入( NO-STEAL 策略) 。STEAL 和 NO-STEAL 的选择取决于你想要什么:使用 UNDO 日志快速写入很长的恢复,还是快速恢复?

下面是恢复策略的影响总结:

  • STEAL/NO-FORCE 需要 UNDO 和 REDO : 最高性能 ,但是更复杂的日志和恢复过程(例如 ARIES)。 这是大多数数据库的选择 。注意,我通过很多研究论文和课程了解到这个事实,但是我没有在官方文档找到(显式的)证据。
  • STEAL/ FORCE 只需要 UNDO。
  • NO-STEAL/NO-FORCE 只需要 REDO。
  • NO-STEAL/FORCE 不需要任何东西: 最坏性能 ,需要大量冗余。

恢复

好了,现在我们有了漂亮的日志,用用它们吧!

假设我们新来的临时工把数据库搞垮了(规则 No 1:总是临时工的错)。你重启数据库,开始恢复进程。

ARIES 从崩溃中恢复需要三个阶段:

  • 1) 分析阶段 :恢复进程读取完整的事务日志*,重建时间线,找出崩溃期间发生了什么,决定回滚哪个事务(所有没有提交命令的事务都要被回滚),哪些数据需要在崩溃时写入磁盘。
  • 2) 重做阶段 :这一阶段开始于分析决定的一条日志记录,使用 REDO 更新数据库,使其回到崩溃开始之前的状态。在重做期间,REDO 日志按照顺序处理(使用 LSN)。对于每一条日志,恢复进程读取包含有需要修改的数据的磁盘上的页的 LSN。如果 LSN(page_on_disk) >= LSN(log_record),意味着崩溃之前数据已经写入磁盘(但是值被日志之后、崩溃之前的操作覆盖掉了),什么都不做。如果 LSN(page_on_disk) < LSN(log_record),那么更新磁盘上的页。对于那些准备回滚的事务也需要进行重做,因为这会简化恢复进程(但是我肯定现代数据库不会这么干)。
  • 3) 撤销阶段 :这一阶段回滚所有在崩溃时未完成的事务。回滚开始于每一个事务的最后一个日志,按照倒序执行 UNDO 日志(使用日志记录的 PrevLSN)。

在恢复期间,事务日志必须警惕恢复管理器执行的动作,以便保证写入磁盘的数据与事务日志中的是完全同步的。一个解决方案是,删除已经撤销完成事务日志记录,但这很困难。ARIES 则是在事务日志中写入补偿日志,删除那些逻辑删除的日志记录。

当事务“手动”取消或者由锁管理器取消(终止死锁)或仅仅是由于网络失败,分析阶段是不需要的。REDO 和 UNDO 所需信息保存在两个内存中的表:

  • 事务表 (保存所有当前事务的状态)
  • 脏页表 (保存哪些数据需要被写入磁盘)

这些表由缓存管理器和事务管理器为每一个新的事务事件进行更新。由于它们是在内存中的,数据库崩溃时就会被销毁。

分析阶段的工作是在崩溃之后使用事务日志重建这两个表*。为加速分析阶段,ARIES 提供了 检查点 标记,其思路是,将事务表和脏页表的内容不定时写入磁盘,并且写入此时最后一个 LSN,这样在分析阶段,只有在该 LSN 之后的日志才会被分析。

总结

在写本文之前,我就知道这个话题是有多大,需要花费多少时间写一篇有深度的文章。事实证明我还是过于乐观,我花费了比预想多两倍的时间,但是我学到了很多。

如果你想很好学习数据库,我推荐阅读这篇研究论文《 Architecture of a Database System 》。这是一篇很好的介绍数据库的文章(110 页),适合非计算机专业人事阅读。这篇文章对编写本文计划给我很大帮助。它并没有像我的文章一样关注数据结构和算法,而是给出很多架构概念。

如果你仔细阅读本文,你应该知道数据库的强大之处。由于这是一篇很长的文章,我来提醒一下你阅读过什么:

    • B+ 树索引的概览
    • 数据库全局概览
    • 基于成本的优化的概览,尤其关注于连接运算
    • 缓冲池管理概览
    • 事务管理概览

但是数据库要聪明得多。例如,我没有碰触下面的问题:

    • 如何管理集群式数据库和全局事务
    • 如何在数据库运行时对其创建快照
    • 如何有效存储(包括压缩)数据
    • 如何管理内存

所以,当你需要在充满 bug 的 NoSQL 数据库和像石头一样坚固的关系数据库之间选择时,我奉劝你要多多思考。不要将我的意思理解错了,某些 NoSQL 数据库非常棒,但是它们还年轻,只能处理某些应用的特定问题。

总结一下,如果以后有人问你,数据库是怎么工作的,我希望你不是像下面一样回答这个问题:

否则的话,你可以把这篇文章甩到他脸上。

8、关系数据库交互式模式挖掘与时间序列数据的预测聚类树分析 本文探讨了关系数据库中交互式模式挖掘与时间序列数据预测聚类树分析的相关技术。重点介绍了 ConQueSt 系统的优势,包括其对多种约束的处理能力、易用性、鲁棒性和高效性;同时,详细阐述了针对时间序列数据的新算法 Clus-TS 和预测聚类树(PCT)的应用,并讨论了其在扩展归纳数据库中的潜力和未来研究方向。 阅读详情

相关推荐

Python 驱动 CAD 二次开发:从零搭建自动化绘图环境

本文详细介绍了如何利用Python进行CAD二次开发,实现自动化绘图。通过win32com库建立Python与CAD软件的通信,文章从环境搭建、连接CAD、操作文档到核心绘图与批量处理,提供了完整的实战指南。该方法能显著提升机械设计、建筑绘图等领域的重复性工作效率,将创造力从繁琐劳动中解放出来。

weixin_29093169的博客 1230

事务的影子拷贝-系统架构师(二十)

9、为了保证事务的原子性,对于执行写操作的数据项,数据系统在磁盘上维护数据库的一个副本,所有的写操作都在数据库副本上执行,而保持原始数据库不变,如何在任意时刻操作不得不中止,系统仅仅需要删除副本,原数据库不受影响,这种叫做()。环境集成机制:提供统一的数据模式和数据接口规范的数据集成机制,支持各开发活动之间通信、切换、调度和协同的(),为统一的操作方式提供支持的()。驱动模块是上面的模块,被测模块则是下面的桩模块,因为自顶向下,所以驱动模块测试好了,则不需要写驱动模块。)处理流程设计是系统设计的重要内容。

ke1ying的博客 1122

深入解析STM32H743双精度FPU:从配置误区到三角函数加速技巧

本文深入解析STM32H743双精度FPU的配置与优化技巧,涵盖常见误区、三角函数加速及飞控系统应用。通过实测数据展示如何利用FPU提升数学运算效率,特别适合工业控制、无人机飞控等高精度实时应用场景。

weixin_29190651的博客 641

mysql入门

Mysql架构 mysql中的并发控制 读写锁 读锁:共享锁 写锁:排它锁 粒度锁 所谓锁的策略就是在锁的开销与数据安全之间的平衡问题。 - 表锁:粒度大 - 行级锁:粒度小 事物 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。 事务的特性(ACID四个特性) 原子性:指事务是一个不可分割的工作单位,事务中的操...

一颗旋转的螺丝钉 534

AI量化交易工作台Vibe-Trading:用自然语言驱动策略回测与多智能体研究

量化交易通过数学模型和计算机程序执行投资决策,其核心在于将市场规律转化为可验证的策略。传统量化开发涉及数据获取、策略编写、回测验证等复杂工程,对非编程背景的从业者构成较高门槛。随着大语言模型技术的发展,自然语言交互正成为降低技术使用难度的关键。Vibe-Trading项目正是这一趋势的实践,它将金融工程任务封装为可调用的工具与技能,允许用户通过自然语言指令直接驱动策略回测、因子研究和投资组合分析。其技术价值在于构建了一个模块化的AI Agent框架,通过ReAct推理框架协调多个专项技能,并创新性地引入多智

weixin_28695161的博客 1567

YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能

本文记录的是基于AIFI模块的YOLOv11目标检测改进方法研究。AIFI是RT-DETR中高效混合编码器的一部分,利用其改进YOLOv11模型,

Limiiiing的博客 2239

影子数据库

什么是数据库中的影子文件? A shadow file is an additional copy of the primary database file(s). More than one shadow file may exist for any given database and these may be activated and de-activated at will usi...

yqling2008 7305

【Android Performance】Android CPU调度模式详解:从performance到schedutil的Governor调优指南

本文系统讲解Android/Linux系统中的CPU频率调节策略(Governor),涵盖六大调度模式的底层工作原理:performance(性能优先)、powersave(省电优先)、conservative(保守调频)、ondemand(按需调频)、userspace(手动控制)以及schedutil(调度器驱动)。文中深入拆解每种Governor的调频决策逻辑、上升/下降曲线的差异、适用场景与选型建议,并配以实操命令演示如何查看可用Governor列表、动态切换调度模式以及多Cluster架构下的统一

weixin_44081096的博客 432

(转)MySQL Group Replication介绍

这是一个振奋人心的消息!2016-12-12,一个重要的日子,mysql5.7.17 GA版发布,正式发布了Group Replication(组复制) Plugin,增强了MySQL原有的高可用方案(原有的高可用方案是指mysql主从架构),提供了重要的特性——多写,保证组内高可用,数据强一致性。1. 背景在介绍组复制之间,我们先简单介绍传统的复制和半同步复制:1.1 传统复制传统mysql复制...

weixin_34292959的博客 207

ICC2:postmask ECO参考脚本

更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 883

使用Matlab simulink的PLC coder功能进行算法搭建与处理

使用的案例如下: Anti-Windup PID Control Demonstration with Feedforward Control 将其中的PID块生成SCL语言再导入TIA 使用的平台如下: Matlab 2019b TIA portal 15.1 应用:可以在PLC中搭载一些并不方便使用的,或者比较难使用的算法 步骤如下: 首先打开案例,案例地址我放在最下面,点击Run运行仿真,必...

苦走一口田 1万+

《高性能MySQL》 笔记之----"影子策略"

利用”影子表”实现表重建策略: mysql&gt; drop table if exists my_summary,my_summary_old; mysql&gt; create table my_summary_new like my_summary; mysql&gt; rename table my_summary to my_summary_old,my_summary_new to ...

探索未知 3115

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 366

PostgreSQL第一步:安装

PostgreSQL是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的BSD-风格许可证下发行。它在其他开放源代码数据库系统(比如MySQL和Firebird),和专有系统比如Oracle、Sybase、IBM的DB2和Microsoft SQL Server之外,为用户又提供了一种选择。PostgreSQL不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequ...

weixin_34179762的博客 85

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

关系数据库的简单概念和简单操作

一.数据库的概念 1.关系数据库:在一个给定的应用领域中,所有实体及实体之间联系的集合构成一个关系数据库。它是一种以关系模式为基础存储数据以及用数字方法处理数据库组织的方法,是目前最为流行的一种数据组织形式。(接下来我所学习的就是关系数据库)它是采用二维表格来存储数据,是一种按行与列排列的具有相bai关信息的逻辑组,它类似于Excle工作表。帮助用户储存数据,方便查找。一个数据库可以包含任意多个数据表。 2.数据管理系统: ①用于管理数据库的软件,对数据库进行统一的管理和控制,以保证数据库的安全性和完整性;

qq_51954912的博客 2334

STM32F407中文手册

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

关系数据库基本概念与名词

文章目录一、关系数据库概念二、关系数据库的主要术语三、关系数据库的对象四、关系数据模型的完整性约束 一、关系数据库概念 关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格。 关系数据模型是目前最重要的一种数据模型,它比层次模型和网状模型更加简单、清晰,并且具有严格的数据基础,因此以关系数据模型为基础建...

Bryce_Liu的博客 2319

廖雪峰Python教程[完整版]

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

第8章 关系数据库设计

定义判断分解。

Flipped7777的博客 693

2020年中级数据库系统工程师考试笔记7—关系数据库1

目录7. 关系数据库7.1 本章考点7.2 关系数据库概述7.2.1 基础知识7.2.2 关系数据库模式7.2.3 关系代数运算7.3 元组演算、域演算和查询优化7.3.1 元组演算7.3.2 关系代数运算转换为元组演算表达式7.3.3 域演算7.4 关系数据库设计基础理论7.4.1 函数依赖7.4.2 码7.4.3 多值依赖   本章内容较多且都很重要分2次总结,上午选择题和下午题都有涉及,是每年必考知识,且实际工作中这部分也是必须掌握的知识。 7. 关系数据库 7.1 本章考点 7.2 关系数据库

成屿的专栏 2173

关系数据库

第二章  关系数据库 1.什么是事务,事务有哪些特效?    答:事务是DBMS的基本工作单位,他是用户定义的一组逻辑一致的程序序列。它是一个分割的工作单位,其中包含的所有操作,要么都执行,要么都不执行。 这4个特效也简称为ACTD特效。 原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性:事务执行的结果必须是使数据库从一个一致状态。 隔离性:一个事务

LKY15078371729的博客 722

关系数据库常用名词及解释

关系数据库常用名词及解释 1、键码(Key):它是关系模型中的一个重要概念,在关系中用来标识行的一列或多列。 2、候选关键字(Candidate Key):它是唯一地标识表中的一行而又不含多余属性的一个属性集,即在同一张表中,也许存在多于一种列的组合可以唯一地标识一行数据,这些任意一种列的组合就是候选关键字; 3、主关键字(Primary Key):它是被挑选出来

paul123456789io的博客 1828

《数据库系统概念》——关系数据库

前面根据网上资料拼凑,已经写过一篇关系数据库的文章了。但是总感觉有些概念模糊不清,甚至部分概念都没有介绍。虽然对整个关系数据库已经有了大概认识,但从它作为当下最主流的数据库之一这点来讲,这个理解程度应该是远远不够的。所以这次主要对《数据库系统概念》(第六版)的第一、二章——关系数据库及关系模型进行学习。这类书可能不那么有趣,但是概念上的完整性,逻辑的严谨度是有保障的。数据模型是描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。关系模型现已称为主要的数据模型。之所以占据主要位置,是因为与早期的数据模

三千幻想乡 2232

关系数据库标准语言SQL及其软件MySQL使用

一、SQL概述 SQL(Structured Query Language)为结构化查询语言,是关系数据库的标准语言。 1.1、SQL特点 1.综合统一 (1)集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。 (2)可以独立完成数据库生命周期中的全部活动: ①定义关系模式,插入数据,建立数据库; ②对数据库中的数据进行查询和更新; ③数据库重构和维护 ④数据库安...

weixin_46119785的博客 811

数据的通用语言——精通 SQL 与关系数据库

SQL是数据科学的核心技能,是与数据库交互的通用语言,负责数据的提取、转换和分析。它以表格形式存储数据,通过SELECT、FROM、WHERE等基本命令实现查询功能,并通过JOIN、GROUP BY等操作处理复杂数据关系。尽管Python和R在建模和可视化方面更强大,但SQL在数据预处理和大规模数据分析中具有不可替代的效率优势。掌握从基础查询到窗口函数等高级功能,是数据专业人员职业发展的必备能力。SQL的语法简单但应用广泛,是企业级数据分析的基础工具。

u014177256的博客 828

sql修改字符串为utf-8_SQL数据分析入门

SQL的知识点:入门简单查询汇总分析复杂查询多表查询项目实战求职面试题什么是数据库?什么是SQL?学习重点数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。用来管理数据库的计算机系统称为数据库管理系统(DBMS)。通过使用DBMS,多个用户便可安全、简单地操作大量数据。数据库有很多种类,重点学习专门的SQL语言来操作关系数据库。关系数据库通过关系数据库管理系统(RDBMS...

weixin_39950552的博客 1413

DASFAA2023 | 关系数据库和图数据库关键技术融合趋势

本期论文导读为大家介绍近年来关系数据库和图数据库关键技术的融合趋势及代表性工作。相关内容来自DASFAA 2023 Tutorial “Fusion of Relational and Graph Database Techniques: An Emerging Trend”,由北京交通大学刘钰博士、中北大学郭青松博士和赫尔辛基大学陆嘉恒教授共同完成。

weixin_48167662的博客 1730

为什么高并发下数据写入不推荐关系数据库?

说到高并发写,就不得不提及新分布式数据库HTAP,它实现了OLAP和OLTP的融合,可以同时提供数据分析挖掘和关系查询。 事实上,HTAP的OLAP并不是大数据,或者说它并不是我们印象中每天拿几T的日志过来用于离线分析计算的那个大数据。这里更多的是指数据挖掘的最后一环,也就是数据挖掘结果对外查询使用的场景。

wdj_yyds的博客 878
上一篇: CORBA 架构体系指南(通用对象请求代理体系架构)​
下一篇: 缓存使用的一些经验
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值