程序员实用算法阅读总结

1 Chapter 1

减少io,和函数调用次数

针对io考虑调整输入,输出缓冲大小。

针对调用次数,考虑使用内联或者宏,尽量避免递归

2 chapter 4 查找

字符串A中找子串

bruteforce查找,可以先判断第一字符是否匹配,否则直接跳过该字符。



2.1 Boyer-moore查找,启发式查找。



英文:

http://www.stoimen.com/blog/2012/04/17/computer-algorithms-boyer-moore-string-search-and-matching/



这篇更简洁易懂中文:

http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html



中文还可以:

http://www.cnblogs.com/lanxuezaipiao/p/3452579.html

看得比较晕,上面的这个算法描述还算容易理解,基本思想,要想从字符串A中匹配查找字符串patternB.刚开始让A和B左对齐,然后从B的右边开始逐个字符匹配,遇到必要情况下右移B。利用bad-character算法和good-suffix算法决定向右移动的距离。此算法优点:

采用了启发式策略引导,使可以多移动一些距离,减少比较次数。

更巧妙的是,这两个规则的移动位数,只与搜索词有关,与原字符串无关。因此,可以预先计算生成《坏字符规则表》和《好后缀规则表》。使用时,只要查表比较一下就可以了。

所以需要针对捜索词pattern做一些预处理,计算出一些good-suffix和bad-character的移动量。



此算法应用在editor的search,replace功能中,比如GNUgrep采用了此算法。



Patlen: 要查找的pattern的长度

textLen: 源字符串的长度。



BM算法的时间复杂度:

准备时间:O(patlen)

最坏情况:O(textLen)

一般情况:O(textLen/patlen)



而bruteforce算法的时间复杂度:

准备时间:0

一般情况:O(textLen)

最坏情况:O(textLen*patlen)



一般来说,从一个大的text中查找一个较长的pattern,当textcharacter种类比较多时,BM算法较好。BM算法的精髓是尽量跳过较大的偏移。避免不必要的比较。

2.2 字符串匹配的kmp算法

中文资料:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

这种算法,于BM算法不同,针对要查找的pattern,每次从pattern的左边开始匹配字符。并维护一个表来觉定当遇到不匹配时右移pattern的偏移量。



2.3 多字符串查找

比如要求从文本中查找多个关键字:abc, def 等等。

方法:

通过构造一个状态机,在某状态匹配一个字符就走到某个状态,来实现查找。依次读入输入流里面的字符,在状态机里面运转。

由于关键字存在overlap,所以状态机也提供回溯的支持,比如在某个状态匹配失败,要求能够回到某个已经匹配了少部分内容的不同状态来再再次尝试匹配下面的内容。

基本思想就是构造状态机。



2.4 模糊字符串查找,非完全匹配字符串

Approximate string matching techniques



给定一个字符串T,给定一个要查找的串p,在T中找最接近P的字串。

那么什么交最接近,给了一个套规则定义了kdifference match. 也就是说允许有k个不同点,比如1个位置不同,多或者少一个字符都算一个不同。

然后算出一个数组d[i,j]来表示p1,....pi 和t1....tj之间的最小的difference.这样数组中最后一行中的最小的difference值也就代表了最接近匹配p的字串的最小difference.那么再从这个位置找字串的起始位置。从而在t中找到一个最接近p的字串。

挺牛逼的看样子,没完全看懂,还是用数学建模来解决问题。

2.5 Phonetic comparasion – soundex算法

语音比较。

语音比较模糊,一个发音游客能有几种匹配。

一种方法就是区分元音,辅音字母,比如忽略元音,给相近的辅音字母分配同样的编号。

那么结果就是,多个单词可能对应同样的编码结果。而实际上这几个单词发音是类似的。

那么可以有着样的场景:

输入一个字符串,把它encode,根据encode结果查找数据库,找到和该encode相同的其他单词。列出来,那么这些单词基本上和输入单词相似。

这些算法是涉及到语言学的。

3 排序

3.1 Bubble sort

O(n2)

3.2 Insert sort

O(n2) 但是由于比较插入操作并不需要比较已经排了序的所有元素,所以耗时比bubblesort较少。

在输入接近已经有序状态时,时间复杂度接近线性。

3.3 Shell sort

普通的插入排序,元素移动较慢。尝试提高此缺点:让元素尽量移动较大距离

将输入分成交叉的若干组。每组插入排序。然后再分组,分组的距离变小,再插入排序。再分组,最后分组的距离是1,执行最后的插入排序。

好处是:元素能够一次性移动较大的位置。

O(N1.25)

因为输入被分组打乱,所以:

没有插入排序在输入接近有序时线性的性能。但也没有最坏的表现。

时间复杂度对于输入较为不敏感。

缺点是:不是稳定的。意味着相等的元素可能位置会互换。

3.4 Quick sort



分而治之法。

选一个privot,把小的挪到左边,大的挪到右边,把privot挪到正确的位置。递归快排左边区域和右边区

域。

privot的选择如果只简单选第一各或者最后一个,对于有序的输入,性能下降到和冒泡一个级别。

并且会导致每一各元素对应一层递归,stack消耗巨大。

所以快排有需要提高的地方:

  1. privot的选择,可以采用随机数,避免某者模式的输入序列产生最差的性能。

  2. 经验表明,较小的输入用插入排序比较快一些。

  3. 当输入量大时,递归造成的stack较深,可以采取选定了privot,把数据按照大小交换位置,分成两组后,对较小一组采取递归,对较大一组采取循环。这样能较少较大一组产生的stack的深度。



正常的性能O(nlgn)

当输入已经有序时,最差性能。可以靠privot的选择来规避。

也不是稳定算法。

3.5 heap sorting

O(nlgn)

因为每次挪出一个元素后,需要从头调整,耗时正比于树高,lgn,有n各元素,所以是nlgn.

构建初始堆时的操作也是nlgn。所以总耗时一样。



最大堆,最小堆

完全2叉树。

从数组中构建最大堆,然后移除第一个元素,也就是当前最大元素(可以和数组最后元素互换),然后从头向下调整堆。然后再次移除...

两个操作:

  1. 构建初始堆

  2. 调整堆



构建初始堆方法,可认为所有叶子节点都是构建完成的堆。从i= (n-1)/2节点开始,也就是从第一个非叶子节点开始。i--。调用调整堆操作。



调整堆的操作可以看成是当堆顶元素是一个新元素时,把他向下”沉”的过程。和孩子比较,有必要的话,和孩子换位,然后再调整孩子堆。



http://blog.youkuaiyun.com/morewindows/article/details/6709644/



虽然heapsort也是O(nlgn),但比quicksort大部分时间较慢,但是在普通quicksort出现最坏场景时,heapsort可以在时间上较为稳定。所有操作都是基于树。为什么呢?因为heapsort从一开始就默认建立一个完全2叉树。而不是一个可能会偏的2叉树。



是Unstablesort

3.6 链表上的insertionsort

3.7 Sort on multiple keys – a fix for unstablesort

有多个key的排序-一个针对不稳定排序算法的纠正

quick sort, shell sort, heap sort都是不稳定的。

尝试采用compoundkey, 也就是说修改比较函数。比较两个对象的key1,如果相同,那么比较另一个数值。

例子,transaction列表里,有用户id,date, 如果已经按照date排了序,我们下面用quicksort按照用户id排序,希望拍完后,还是保持了date的正确顺序,就需要排序的比较函数把date也考虑进去,否则date就会乱掉(unstablesort的特性)

3.8 network sort

给定n个数,可以算出一组比较+swap(如果有必要)操作,只需要执行这些操作,最终结果就是排序的结果。这些操作是固定的。而且有些操作涉及到的数据互不影响,因此可以并行,或者用硬件来实现。那么这种算法就会比以前的算法都要快。

但是缺点:不同的n对应不同的操作序列。并且当n很大时,操作序列也会很多。

比较适合n不是很大,且n每次都固定,并且需要很快的排序的场景。

Bose-nelson算法就可以根据输入n算出一组比较操作序列。

3.9 排序算法的选择

Shell, quick, heap sort在较少数据上的排序差距不大,较大数据上才能有差别。

Quick,heap的O(nlgn)在较大输入时,才能体现出对于shell的o(n1.25)的优势。

Shell, heapsort基本上没有最差场景,耗时相对稳定。

Quick sort有最差场景,但是可以通过若干调整尽量避免。

总体来说有限选择quicksort.



4 Trees

二叉树BST,了解插入,删除算法。



4.1 red-black tree

Avl tree是平衡的tree.

red-black tree是avltree的一个实现。

靠红,黑节点,来实现平衡。叶子必须黑,不允许两个相邻节点红。

avl要求高度差最大是1,而红黑树是近似平衡,要求高度差最大一倍。虽然查找速度不如avl,但是量级一样,且维护成本低于avl。



红黑树的特性很重要:

  1. Every node is either red orblack.

  2. The root is black.

  3. Every leaf (NIL) is black.

  4. If a node is red, then both its children are black.

  5. For each node, all simplepaths from the node to descendant leaves contain thesame number of black nodes.



红黑树的资料:

中文:

http://bbs.youkuaiyun.com/topics/350253651

http://blog.youkuaiyun.com/eric491179912/article/details/6179908



下面文章相关:

http://blog.youkuaiyun.com/v_JULY_v/article/details/6109153

http://blog.youkuaiyun.com/v_JULY_v/article/details/6284050



红黑树插入算法,基本上先按照和2叉查找树相同的方法找到插入点,然后插入一个红色节点。

然后以此红色节点检查调整。主要思路就是分情况调整,涉及到调整节点颜色,以及旋转操作以维护rb特性。

详细参看introductionto algorithms 3rd 13.3章节讲了rbtree插入节点算法。

13.4节讲删除节点的算法.

要先弄懂12.3中BST的删除算法。然后更容易弄懂RBtree的删除算法。

总体上讲,红黑树插入删除算法过于复杂,主要罗列了若干场景,而且依赖算法把若干场景转化成其他场景,最终解决问题。

其算法记不住。



4.2 splay tree.

也叫伸展树,他不保证树的平衡,但是当每访问一个节点,就通过zig,zag, zig-zig, zag-zag, zig-zag,zag-zig等操作将该节点旋转为根节点。这样能够将频繁被访问的节点挪到靠近树根的位置。从而提供较好的查找效率。所以他在性能上体现的是多次的非随机性查找上的优势。

时间复杂度O(lgn)

可以用来实现cache,garbage collection 算法。

缺点:因为不平衡,所以有可能深度是n.

此外,每次读访问,都会造成结构变化,所以对于多线程访问,控制上较为复杂。



可以提供区间操作,比如找到在[a,b]区间的所有的节点:

可以先找到小于a的节点并挪到树根,然后找到大于b的节点,在右子树中,将其挪到树根。那么此时,右子树的左子树就是[a,b]区间内部的节点。



有一种通过构建splaytree来实现排序的算法,叫做splaysort.

也是O(nlgn)粒度,一般情况下,慢于quicksort, 但是当输入较为有序时,快于其他算法。



伸展树的splay操作有两种实现方式,一种是自底向上,从要做splay操作的节点开始,向上找到其父亲,祖父节点,一次旋转。缺点需要维护向上的指针。

另一种方法是自顶向下,优点:在查找一个节点的过程中,就完成splay操作,当节点找到后,splay操作可以马上完成。

基本方法是:将树分成左,中,右3棵树,开始时,左,右是空树。判断要找节点x,如果比中树根节点大,那么肯定在根树的右子树上,那么中树在根节点左旋,将根节点和根节点的左子树分出来链接到左树上。如果要找节点比根节点小,那么肯定在左子树上,那么就右旋并把根节点和右子树分开链接到右树上。一次向下走。最后三颗树合并。

注意向左树合并新内容时,要将何如的内容链接到左树的最大节点的右分支上。向右树合并新内容时,要将新内容添加到右树的最小节点的左分支上。

具体内容可以看如下:



中文:

http://blog.youkuaiyun.com/ljsspace/article/details/6461005



http://blog.youkuaiyun.com/leolin_/article/details/6436037



4.3 B-tree

是分支数目>2的平衡树

B-tree适合于处理数据存储在磁盘的情景。

数据库,文件系统

增加一个节点中的存储的key的数据量,从而也增加了child节点的数目。这样减少了查找节点的操作,一次性获得较多内容。

节点的孩子的数目不定,但是至少halffull. 比如最多允许有m各孩子,那么至少有m/2个。这保证了空间的使用率。

http://blog.youkuaiyun.com/hbhhww/article/details/8206846

https://en.wikipedia.org/wiki/B-tree



5 data compression数据压缩

5.1 run length encoding, rle 压缩

将重复字符用字符本身和重复的数量表示。

引入一个特殊字符表明encoding的开始。

简单,快速。

5.2 huffman encoding

先扫描一边输入文件,记录所有的字符的出现频率。然后排序,构造一个2叉树,树的叶子是字符,从树根,到叶子的路径决定了叶子上的字符的编码。保证频率高的字符的编码长度短。这样所有的字符都有了编码。然后再过一遍输入,将所有字符编码。

缺点:只是针对字符的编码,无法解决重复出现的字符串pattern的压缩。

于是出现了dictionarybased compression

5.3 sliding window compression

在压缩/解压缩过程中,维护一个固定长度的window,里面存储之前刚出里过得原始内容,当下面要处理的内容有和window中匹配的串时,就可以压缩。这个window一直向前走。所以叫做slidingwindow算法。

5.4 lzw 压缩算法

中文:

http://1454396751.iteye.com/blog/1912156



https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch

基本思想:不需保存字典,字典在压缩和解压缩时动态生成。开始时,字典中预先保存所有字符。读取输入字符时,将前一个字符或者字典中的词和当前字符结合成一个新词,看字典中是否有此新词,如果有,继续读取下一字符,如果没有,就将前一个字符或者字典中的词对应的编码输出,并生成一个新词计入字典。生成的新词都对应一个新的编码。

每个输出编码大小要大于原始字符编码。增加的空间为了表示字典中的词。

比如8bit可以表示255个字符,那么我们用12bit就可表示更多的内容,多出来的内容就可来表示一些字典中的词。

6 data integrity and validation



Crc-16

crc-32

基于云盾构建等保三级Web安全体系:从合规要求到实战落地 网络安全等级保护(等保)是保障信息系统安全的重要制度,其核心原理是通过分级防护、动态调整的策略,构建纵深防御体系。在技术层面,等保要求覆盖物理环境、通信网络、区域边界、计算环境和安全管理中心等多个层面,旨在通过技术和管理相结合的方式,有效应对网络攻击和数据泄露风险。对于Web应用而言,满足等保三级要求具有极高的技术价值,它不仅是合规的刚性需求,更是提升业务系统整体安全水位、建立用户信任、保障业务连续性的关键工程实践。在云计算时代,利用云原生安全服务(如Web应用防火墙WAF、云安全中心、态势感知等)可以高效 阅读详情

相关推荐

contextcapture多区块点云_多源点云数据融合的建筑物精细化建模

本文内容来源于《测绘通报》2020年第8期,审图号:GS(2020)3611号多源点云数据融合的建筑物精细化建模王树臻1, 郑国强1, 王光生1, 胡玉民2, 张德怀2, 亓伟3 ...

weixin_36301639的博客 1825

1978年的图灵奖获得者-Robert W. Floyd

<v:shapetype id="_x0000_t75"coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"filled="f" stroked="f"><v:shape id="_x0000_s1

温研的专栏 (探索OS内核的奥秘) 5549

高通camera:PDAF的配置与测试

确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。

arvin_xiong的博客 2489

程序员实用算法.pdf

Napoleon的专栏 845

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

Python 爬虫实战:模拟登录网易云音乐(加密接口逆向与自动化登录实现)

网易云音乐作为国内主流的音乐流媒体平台,其丰富的音乐资源和个性化推荐算法吸引了大量用户。对于开发者而言,模拟登录网易云音乐并实现自动化操作,可以用于数据分析、歌单同步、歌词抓取等场景。然而,网易云音乐采用了多重加密机制和反爬策略,直接模拟登录存在较大挑战。

yansideyucsdn的博客 2590

最实用的Java数组算法,工作面试掌握这些就够了

天这篇文章是数组中的算法篇,我在这里分享几个很实用的数组算法,初级程序员工作面试掌握这些就够了,太多了也没必要。头条号“一张图学Java”分享的内容就是以实用为主,看了就会,会了就能用上,以最少的时间精力掌握最多的实用技术。获取更多源码,视频,学习资源!欢迎加入裙:616959444 J...

chengqi5276的博客 162

别再用第三方黑盒库了!从零手写C#+YOLOv12推理全流程,框位准、可定制、调试快10倍

从零手写YOLO推理框架,不是为了造轮子,而是为了完全掌控代码,工业现场的需求千变万化,第三方黑盒库根本没法满足所有需求。这套代码我已经在东莞长安的3家PCB厂、深圳南山的2家3C电子厂落地了,稳定运行6个月,没有出过任何问题。如果有什么问题或者需要扩展的功能,都可以在评论区交流。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 328

挑战代码阅读

关于代码阅读 忘了从什么时候开始,“一句代码搞定的事情”,“写代码写到一定程度就要做管理或架构” 曾经,我也是可视化和IDE的狂热支持者 肯定的,读代码对你工作没帮助,公司是让你来写代码,而不是要你来读代码 代码阅读涉及的范围(排名不分先后) HLGL Shader代码阅读(Unity 自定义ShaderLab) 本职工作的一种热门代码(JAVA或者C#或者PHP),不包括公司里的“大神”框架的封装 CodeReview 汇编语言 Linux等远程操作(连接器) Github开源项目代码

大话程序员 176

【Python基础】FastAPI 从入门到项目实战操作详解

【Python基础】FastAPI从入门到使用实战操作详解

congge_study的博客 456

matlab电子科技大学数学实验期末模拟35道(1)

【代码】matlab电子科技大学数学实验期末模拟35道。

c_wrj_的博客 2044

少有程序员读的书

原文:Books Programmers Don’t Really Read 作者:billthelizard 翻译:赖信涛 责编:仲培艺 马克吐温说过,经典的小说就是大多数人都想读,但是很少有人花时间去读的小说。对于编程类的书来说,差不多也是这样。 在StackOverflow以及其它一些编程论坛上,经常会有人问有哪些适合程序员的书。同样的问题经常会多次被人...

162

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

本文记录的是基于 GhostNetV3 的 RT-DETR轻量化改进方法研究。GhostNetV3的轻量模块采用方法,训练时为深度可分离卷积和1×1卷积添加,推理时通过移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现RT-DETR的轻量化改进。

Limiiiing的博客 973

改变我软件工程师职业生涯的 10 本书

随着我职业生涯的不断进步,设计强大的系统成为我工作中的一个重要部分。本书深入探讨了数据系统的基础知识,教你如何处理可扩展性和可靠性——对于任何从事后端系统或复杂架构的人来说,这都是必读之作。《代码整洁之道》让我意识到让代码易读、简洁的重要性 — 这项技能对我和我的队友以及我的初级工程师都有帮助。对于任何想要编写既实用又美观的代码的人来说,这都是必读之作。《凤凰项目》的这本配套书深入探讨了开发者的体验和创新的作用。它激励我创造一个环境,让我的团队能够蓬勃发展、发挥创造力并交付高质量的工作。

zhu hong yu 1285

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

程序员的入门门槛真的那么低吗?

很多人工资低干不下去,想转程序员;还有很多没学历的想改变生活的,也说要做程序员;以及一些大学里应届生,找不到工作,自学想当程序员。你尝试让数据来驱动程序,而不是层层嵌套的逻辑,无休无止的if else,你想把程序度短变平,你想把复杂的逻辑编程简单的“配置”,你想让这些配置来帮你写逻辑,而不是自己手动去敲逻辑代码。其实求职和工作过程一样,都是一分耕耘一份收获,如果在找工作的过程中,端正心态、认真准备...

weixin_34352005的博客 870

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

十年资深程序员常用网站!务必收藏!

十年资深程序员常用网站!务必收藏!

Mr_HelloWorldx的博客 331

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

适合java零基础的学习技巧——Java程序员学习的6个技巧

知识改变命运,对于Java程序员来说,技术不断更新,只有及时充电,才能不被市场淘汰。我今天为大家分享Java程序员学习的6个小技巧。 1一定要看书 现在学习Java变得比以前容易多了,除了有大量的视频教程外,还有专业的java培训机构,这都使学习变得更加傻瓜化,然而我要说的是,Java虽然...

choujuegua3942的博客 381

程序员GIS入门|前后端都要懂一点的GIS知识

程序员GIS入门|前后端都要懂一点的GIS知识

2501_93198876的博客 449

rsa算法计算器_GitHub上标星80k的算法笔记,是有什么与众不同的魅力?

程序员到底需不需要学习算法?这个问题被争论的次数绝对不亚于“Java是不是最好的语言”“VIM和Emacs谁是最好的编辑器”“程序员是不是需要学习数学”。为了避免陷入这样的争论里,我们先对“算法”一词做个转换定义,什么是算法?我们看看标准的定义:能够对一定规范的输入,在有限时间内获得所要求的输出的一系列指令都叫作算法。这个定义太抽象了,让我们简单来说,算法其实就是解决问题的思路和办法。那么从这一一...

weixin_39664962的博客 231

计算机博弈程序python_程序员大神们的经典编程语录

作为程序员的你,下面这些程序员经典语录请您认真来读一读,也许此时此刻会有不一样的心得体会与收获。“大多数优秀的程序员从事编程工作,不是因为期望获得报酬或得到公众的称赞,而是因为编程是件有趣的事儿。”——林纳斯·托瓦兹(Linus Torvalds)“一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。”——道格拉斯·林德(Doug Linder)“这是我能想到的,唯一可以让我既当工程师又做艺术...

weixin_39722025的博客 414

程序员求职高峰期,这12条工作小技巧必看

过完春节,该拿的奖金都拿了,又到了一年一度的离职高峰期,新老手程序员纷纷走上了求职之路。 今天给所有程序员提12条工作小技巧,让你在新工作上越做越顺。

测试萌萌 641

打基础、冲竞赛、刷面试,这本算法书直接封神!

然后,在从“2”方格走一步可以到达的方格中写上“3”,如此反复,直到最终到达 G方格。书里用这样一个“从迷宫入口走到出口”的例子作为切入,不只是讲算法流程,而是让你动手画图、观察节点状态、写出判断逻辑,把抽象算法变成可推演的现实过程。很多人说程序员是“写代码的人”,但真正厉害的人从来不只是会敲键盘——他们能建模、能分析,能把一个复杂问题拆清楚,然后用最优的方式解决它。但遗憾的是,我们很多人学编程,学语法、写项目,却很少有人系统地教过我们该怎么用算法,把一个实际问题解得更好、更快。

图灵教育 377

编程珠玑:续(编程珠玑.Ⅱ修订版)

经久不衰的计算机科学名著集深邃思想、实战技术与趣味轶事于一册领略计算机科学之美   《编程珠玑:续》   基本信息 原书名: More Programming Pearls: Confessions of a Coder 原出版社: Addison-Wesley Professional 作者: (美)Jon Bentley    [作译者介绍] 译者: 钱...

china-pub网上书店 495

探索数据结构与算法的奥秘:《数据结构与算法分析:C语言描述(原书第2版)》PDF下载

探索数据结构与算法的奥秘:《数据结构与算法分析:C语言描述(原书第2版)》PDF下载 【下载地址】数据结构与算法分析C语言描述原书第2版PDF下载分享 本仓库提供《数据结构与算法分析:C语言描述(原书第2版)》PDF版本的下载。该书是国外数据结构与算法分析方面的标准教材,详细介绍了数据结构(大量数据的组织方法)以及算法分...

gitblog_06505的博客 1008

程序员必读经典书单与技术进阶指南

在软件开发领域,持续学习是程序员保持竞争力的关键。经典技术书籍作为知识沉淀的载体,能够帮助开发者构建完整的计算机科学知识体系。从《代码大全》的编程实践到《算法导论》的计算理论,这些著作系统性地覆盖了代码质量、设计模式、数据结构等核心概念。尤其在当前快速迭代的技术环境下,React、Kubernetes等框架的更新更需要扎实的基础作为支撑。精选书单不仅能提升开发效率,还能通过重构、设计模式等实践显著改善代码质量。无论是前端工程中的模块化开发,还是微服务架构下的数据一致性方案,这些经典知识都能为实际项目提供可靠

weixin_30520015的博客 349

程序员编程艺术第一~二十二章集锦与总结(教你如何编程)

程序员编程艺术第一~二十二章集锦与总结(教你如何编程) 作者:July、编程艺术室。出处:http://blog.youkuaiyun.com/v_JULY_v。 题记 好久没更新博客了,虽只有一个月,但对我来说,已是长久。最重要的是11月初来北京后,在这近一个月找工作的过程中,面试、拜访、购书、读书,亦许久没有敲代码了,手异常生疏,虽只有一个月,但对我来说,仍已是长久。为了表示我一直在关注着本博客,从...

编程开发资料库 368
上一篇: chromium+blink网页加载流程
下一篇: Introduction to algorithms 3rd 阅读总结和部分习题分析
csshell2002
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值