MapReduce: Simplified Data Processing on Large Clusters

MapReduce: Simplified Data Processing on Large Clusters中文版 来自于GOOGLE的mapreduce的开山之作,此文是原英文的中文版本,希望能互相参照,加深理解 立即下载

题记:这是我确定自己未来深入学习的三个技术方向之一分布式开发的首篇文章,大家都知道谷歌的这三篇文章实际上成为分布式开发至关重要的论文,我想从源头了解下分布式这部分的背景知识以及发展过程,我并不打算去学习hadoop的具体代码细节,因为毕竟现在有更加适合大规模运算的spark可以运用,同时spark还比较适合机器学习这方面,而这方面同样也是我以后想继续的方向之一,因此在熟悉完这三篇文章之后,我的重点将会放在spark以及机器学习算法方面,路漫漫其修远兮,自勉之!


需要说明下,这部分不会是该论文的对应翻译,而只是在理解的基础上翻译以及总结。


首先简单介绍下MapReduce,MapReduce实际上是一种编程模型,主要是用于处理大规模数据集,其实现核心逻辑实际上是跟分治方法是统一的。在这个编程模型下,用户只需要关心两个函数,一个是map函数,用于处理一个键值对,然后生成一个中间键值对的数据集合。另一个是reduce函数,是用来将map产生的中间键值对数据集根据相同中间键来进行合并操作。这种编程模型自然而然的是可以通过在一个集群上进行并行的处理。整个系统需要做的是划分输入数据、调度作业任务与机器、处理机器故障以及管理机器间的通信等等,但是这些问题并不是用户需要操心的,当一个完备的集群方案确定后,用户完全不用去了解并行分布式系统的操作流程,便可以进行最大化利用分布式集群的功能。

一、编程模型

整个计算需要一个键值对数据集输入,同时输出的也是一个键值对数据集。前面也提到,用户在使用MapReduce的时候只需要定义map和reduce函数。map函数会处理输入键值对然后产生一个中间键值对数据集,然后这个编程模型会将所有中间键相同的数据组合起来,并将它们传递给reduce函数。而reduce函数则是接受某个中间键和该键的一个数据集合,他会根据需求去合并这些数据,从而产生一个更小的数据集,通常情况下reduce函数产生0或者1个输出。中间数据是通过迭代的方式来提供给reduce函数的,这样就可以处理内存无法满足的大量数据。

1.1 例程

考虑一个问题,那就是统计大批量文档中每个词语的出现的次数。用户可以按照下面的伪代码完成MapReduce过程:

map(String key, String value):
    //key: document name
    //string: document contents
    for each word w in value :
        EmitIntermediate(w, "1");

reduce(String key, Iterator values):
    //key : a word
    //values : a list of counts
    for each v in values:
        result += ParseInt(v);
    Emit(AsString(result));
这个map函数会将每个word都填上一个1的词频数发射出去,然后reduce函数将同一个word发射出来的数目加起来。对的,事情就是这么简单!!!

1.2 更多例子

这部分主要是介绍MapReduce可以应用到很多有意思的项目去,比如:

分布式查找:这里面的map函数是当某一行满足提供的匹配,就把改行发射出去,然后reduce函数是一个identity函数,仅仅是将提供的中间数据拷贝到输出。

URL统计:这里面的map函数处理网页请求的日志信息,然后输出(url, 1),然后reduce函数为同样的url的值累加起来,输出(url, total_count)。

网络连接图逆向:这里面的map函数为每一个source网页中的一个target链接输出一个(source, target)对,然后reduce函数对每一个给定的目标url,建立一个list,并输出(target, list(source))。

二、实现

2.1 执行流程

这部分主要讲的是google他们用的一个计算集群,具体的集群机器情况,可以看原文介绍,总结就是普通机器,普通内存,普通网络,普通存储,哈哈,不然怎么显示出威力呢。下图是文中介绍的mapreduce执行流程图,这个就比较重要了:


大体上是这样的,M调用会通过自动将输入数据划分成M份的数据集后在多个机器上分布,这些被切分的小份数据会在不同的机器上并行地被处理。而reduce函数则是根据一个parition函数根据中间键将中间数据分成R份。至于分成数量R和partition函数都是由用户自定义。上图就是一个mapreduce操作的执行的整体流程,当一个mapreduce被执行,需要经过以下步骤:

1)用户程序中的MapReduce库首先将输入文件分成M份,每份大小一般是16到64MB,这个可以由用户可选参数控制,然后便会将程序在集群的机器上拷贝。

2)在程序中,有一个程序比较特别,那就是master程序,其他的程序都是worker程序,worker程序用来接收master分配的任务。根据上面分配可知,一共有M个Map任务和R个reduce任务等待分配,master会选择空闲的worker,然后分配map或者reduce任务给他们。

3)当一个worker接收到一个map任务时,便会读取对应的输入。他会从输入文件中解析出一组键值对,并将每一个键值对依次传给用户自定义的map函数,而map函数输出的中间键值对会被保存到内存中去。

4)周期性地,这些被缓存在内存中的键值对数据会由前面提到parition函数分成R份后写入到本地文件中去。这些被存到本地的键值对数据的地址会被回传给master,之后再由master传递给reduce任务的worker。

5)当一个reduce任务的worker被master告知了这些地址,它便会使用远程程序调用方式从那些map任务的worker机器本地磁盘上读取数据。当一个reduce任务的worker读完了所有的中间数据后,他会根据中间键排序,从而使得具有相同的中间键能够被分到一起去。这个排序过程是需要的,因为有时候可能不同的中间键值对数据会被映射到同一个reduce任务的worker。如果中间键值对数据过大很难在内存张排序,外部排序会被使用。

6)reduce的worker会被已排完序的数据中迭代,对每一个唯一的中间key,worker会将这个key和对应的数据集合传递给用户定义的reduce函数。reduce函数的输出会被添加到最终的一个输出文件中去。

7)当所有的map和reduce任务都完成后,master会唤醒用户程序。此时,执行mapreduce的用户程序会得到一个返回结果。

当成功完成后,mapreduce执行的结果输出会存在R个输出文件中,一般情况下,用户并不需要将这R个输出文件合并成一个文件,这些文件经常会被作为输入文件进行另外一个mapreduce过程,或者其他的分布式程序再次被切分成多个文件。

2.2 master数据结构

从刚才的流程看,master在整个流程中起到了至关重要的作用,不仅需要了解任务的情况,还需要了解worker的情况,以及输入输出的情况,这时候高效的数据结构也就显得很重要了。典型情况下,master会保存若干个数据结果,对每一个map任务和reduce任务,它会保存他们的状态(空闲,进行中,已完成)以及对应的worker机器。master作为map任务中间输出到reduce任务的管道,因此对每一个已完成的map任务,master会保存R份中间数据文件的大小和位置,当map任务不断完成时不断更新。这些信息会不停地添加到执行reduce的worker机器上去。

2.3 容错

其实仔细看前面的流程,我们就会有很多很多的疑问,比如说万一master机器挂了呢,岂不是所有任务都跑不了了?比如说某个机器被分配了任务,然后任务出错了,其实不是任务永远都完成不了了?等等,当然不会!!不过说到这里,正好说明下一件事情,其实MapReduce编程的逻辑没什么可以多说的,就是一个简单的分而治之的思想,但是对于分布式系统来说,最难的根本不是这方面,而是对于多机器情况下,任务分配、资源管理、容错控制、一致性保证,这些才是最最关键的,也是最难的,如果真正做到了补充不漏不丢不冲突的分布式系统,那绝对是一个特别特别牛逼的工作。

这个系统也一样,既然是在成百上千台机器上进行的运算,维护的难度可想而知,因此容错是必须的,但是必须是优雅的容错,什么意思呢,如果出现了问题,一个报警告诉管理员,然后程序员坑次坑次跑去重启任务,重启调度这种就显得很low了,文章说了几个容错的方式,一起了解下:

1)worker失败。master会周期性的ping每个机器,如果一个worker在一定时间内没有回应,master会将该机器标记为failed。这时候,这个机器上的所有已完成map任务都会被标记为空闲状态,这样那些map任务就会被重新调度给其他worker去处理。同样,任何在一个失败机器正在执行的map或者reduce任务也会被重置为空闲状态等待重新调度。可能会有疑问,为神马map任务都完成了还需要重新执行,这是因为已完成map任务的输出是存储在失败机器的本地磁盘上,这时候这些数据在机器有问题以后是不能被访问的;而已完成的reduce则不需要重新执行是因为这些输出已经存到了最终输出文件里面去了。当一个map任务在A机器上执行失败后,在B机器上会重新执行,这时候,master会通知所有正在执行reduce任务的worker这种变更,这样还没有从A机器获取数据的reduce任务会从B机器上获取。

2)master失败。对于master的可能性失败,一种比较简单的方法是周期性的将前述master的数据结构写到磁盘里面去,这样万一master挂了,另一个master会从最后写入的数据中恢复出来。

3)失败出现的语义描述。当用户自定义的map和reduce函数是确定性函数的时候,我们分布式实现产生的结果肯定是与无错误情况下整个程序顺序执行的结果一致。在实际过程中,我们依赖map和reduce任务输出的原子提交来实现这一点。每一个进行中的任务,都会将自己的输出写到一个私有的临时文件中去。在mapreduce操作中,一个reduce任务会写一个这样的文件,一个map任务会写R个这样的文件。当一个map任务完成后,这个worker会给master发送消息,并告知这R个临时文件的名字。如果这时候master收到早已完成map任务的消息,即之前已完成过,会忽略这个消息,否则,他会将这R个文件名存到一个数据结构中去。当一个reduce任务完成后,reduce worker会原子性的将临时文件改成最终输出文件。如果同一个reduce任务在多个机器上执行,多次重命名调用会被执行在同一个输出文件上。我们可以依赖文件系统本身提供的原子重命名操作来保证最终的文件系统只包含一个reduce任务的最终输出。

大多数情况下,我们的map和reduce操作都是确定性的。另外,实际上我们的语法实际上与顺序执行时一致的,这样程序员就很容易去推理他们程序的行为。当map或者reduce操作不是确定性的时候,我们同样提供了差一点但是同样合理的语义方法。在非确定性操作出现的时候,一个特定的reduce任务R1的输出会和另一个reduce任务R1的输出一样(因为执行程序不确定性)。但是,一个不同的reduce任务R2则会跟另一个reduce任务R2不一样了就。

2.4 备份任务

一个比较普遍影响MapReduce操作总体时间的原因是因为有一个"掉队者"出现了:有一个机器在处理剩余的一个map或者reduce任务消耗的时间超过正常范围。这种现象产生的原因可能很多,比如网络,比如磁盘IO,比如有新的其他的任务插进来了,等等。这时候,有一个比较简单的机制来处理这个问题,那就是多一个mapreduce操作快接近结束时,master会给这些剩余正在进行中的任务建立备份任务,这样无论是原先的任务完成还是备份的任务完成都会被标记成任务完成状态。这种机制可能会多侵占些资源,但是效果很好。

三、优化

尽管简单的map和reduce函数已经很好地满足了大部分需求,但是还是有一些优化可以极大的提高效率。

3.1 分类函数

MapReduce的用户指定了他们希望得到的reduce任务输出的个数是R个,数据会通过在中间key上执行分类函数进行划分。一般情况下默认的分类函数是哈希函数,这一函数会得到一个相对比较平衡的划分结果。但是,在某些情况下,对key使用自定义的分类函数来划分数据更加有效。比如说,有时候中间key是url,我们想将连接同一个host的数据放到同一个文件中去,这时候如果我们不是对url进行哈希,而是先提取url中的主机数据,再对主机数据进行hash,这时候才能满足更好的满足我们的需求。

3.2 顺序保证

我们保证在一个给定的分类中,中间键值对数据是按照中间key进行升序排列的。这个顺序保证使得对每一个分类输出一个有序结果非常简单,这对于要求输出结果方便查找等情况非常有用。

3.3 连接函数

在某些情况下,每个map任务产生的中间key数据有大量重复,这时候reduce函数就需要进行相互交互和聚合操作。一个很简单的例子就是词频统计,由于每个词频遵循Zipf分布,每个map任务都会产生成百上千个<the, 1>这种记录。这些记录都会通过网络传递给同一个reduce任务,然后再在reduce函数中进行统计得出结果。这时候,我们就允许用户自定义一个combiner函数,这个函数会在数据传递给reduce任务之前进行局部的合并操作,节省了大量的网络传输。这个combiner函数是在每一个map任务机器上执行的,通常情况下,这个函数与reduce函数是同样的代码。他们两之间的区别在于输出是最终输出文件还是中间数据文件。

其实文中还介绍了其他比如说类型优化,跳跃某些有问题的记录的优化,状态信息统计优化,以及本地执行调试的优化,这些大家都可以自己从文章里面看,只是因为他们的重要性不是那么强,就不在这里详述了。同时文中最后部分介绍了这个模型的功能强大,也给出了很多实际使用的例子,实际上可以了解一点,也再次说明一点,大规模分布式系统的逻辑实际上并不是那么复杂,真正复杂之处在于性能的优化,而优化点设计范围很广,技术要求也就很高了,实际上主要是可以分成几个方面:1)资源管理,磁盘的管理,网络的管理,内存的管理,任务的管理,如果在最大化使用硬件本身的同时最大化使用结果;2)容错的管理,分布式的最佳实践是用户感知不到是分布式工作,这时候就需要分布式系统能够保证数据补充不漏不丢,容错容灾能力是考研分布式系统稳定性很重要的一环;3)数据的一致性,其实mapreduce的一致性要求还不是那么严格,而且前面提到了许多操作是原子性操作的要求,这个要求实际上就是保持数据一致的,真正数据一致性的严格可能还是在文件系统,分布式数据库等等方面,这是一个艰难的问题,同时也是效率与准确之间的取舍。


MapReduce: Simplified Data Processing on Large Clusters翻译 立即下载

相关推荐

MapReduce: Simplified Data Processing on Large Clusters 英文原文

这是谷歌三大论文之一的 MapReduce: Simplified Data Processing on Large Clusters 英文原文。我的翻译可以见https://blog.youkuaiyun.com/m0_37809890/article/details/87830686

MapReduce: Simplified Data Processing on Large Clusters MapReduce:面向大型集群的简化数据处理

摘要 MapReduce既是一种编程模型,也是一种与之关联的、用于处理和产生大数据集的实现。用户要特化一个map程序去处理key/value对,并产生中间key/value对的集合,以及一个reduce程序去合并有着相同key的所有中间key/value对。本文指出,许多实际的任务都可以用这种模型来表示。 用这种函数式风格写出的程序自动就拥有了在一个大的PC机集群上并行执行的能力。运行时系统会负责细节:切分输入数据,在一组机器上调度执行程序,处理机器错误,以及管理所需的机器间通信。这允许不具备任何并行和

老街# 1499

MapReduce-Simplified_Data_Processing_on_Large_Clusters中文版(免积分下载)

MapReduce-Simplified_Data_Processing_on_Large_Clusters中文版

MapReduce: Simplified Data Processing on Large Clusters 翻译和理解

MapReduce: Simplified Data Processing on Large Clusters 概述 MapReduce 是一种编程模型,用于处理和生成大型数据集的相应实现。用户定义一个map函数以处理 key-value 键值对,生成中间态的 key-value 键值对。还要定义一个reduce函数来合并所有有相同中间态 key 的所有中间态 value。许多现实世界的工作都可以用这个模型实现。 以此风格编写的程序可以自动并行化地在大型商用机器集群上运行,运行时系统负责以下任务: 对输入

pedro7k的博客 4354

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1684

Ubuntu 22.04下Colmap带CUDA支持的编译安装全攻略(附显卡架构查询指南)

本文详细指导在Ubuntu 22.04系统上从源码编译安装支持CUDA加速的Colmap,解决了官方版本无GPU支持导致处理速度慢的问题。重点包括环境依赖准备、CUDA工具链配置、显卡计算能力查询以及完整的编译安装步骤,旨在帮助研究者和开发者高效部署高性能三维重建工具。

gold8的专栏 345

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

当在一个足够大的 cluster 集群上运行大型 MapReduce 操作的时候,大部分的输入数据都能从本地机器读取,因此消耗非常少的网络带宽。用户可以控制操作的执行,并且可以将其限制在特定的。操作是输入确定性函数(即相同的输入产生相同的输出)时,MapReduce保证任何情况下的输出都和所有程序没有出现任何错误、顺序的执行产生的输出是一样的。MapReduce 模型的核心思想是将大规模的数据集分解成多个小的数据块,然后分配给集群中的多个计算节点进行并行处理,最终将结果合并成最终的输出。

pursuit的博客 3432

深入解析Panfrost驱动:Mali-GPU开源驱动的架构与实现

本文深入解析了Panfrost驱动作为Mali-GPU开源驱动的架构与实现。从诞生背景到硬件架构演进,详细介绍了Panfrost如何突破ARM闭源策略,实现全栈支持。文章还探讨了驱动设计中的关键技术挑战与性能优化策略,为开发者提供了实用的编译部署指南和性能调优方法。

weixin_30790841的博客 552

MapReduce Simplified Data Processing on Large Clusters 论文笔记

MapReduce 是一种变成模型,用于处理和生成大规模数据。用户指定 map 函数处理每一个 key/value 对来产生中间结果的 key/value 对;reduce 函数合并每一个相同中间 key 的 value。这种编程风格能自动获得并行在大型集群上运行的便利。这套运行时系统则帮助用户接管来数据分片分发,机器通讯,节点失败等问题。无需用户了解并行分布式系统的知识就能利用好大型分布式系统。

波波的专栏 1447

CentOS7安装OpenSSL1.1.1s

CentOS7安装OpenSSL1.1.1s

Bertram的博客 733

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 970

003.精读《MapReduce: Simplified Data Processing on Large Clusters》

综上所述,MapReduce编程模型通过用户定义的map和reduce函数,将复杂的数据处理任务转化为直观的操作,并自动并行化处理,极大提高了计算效率,尤其在大规模集群环境中表现出色。其内置的容错机制确保了数据处理的可靠性,使得MapReduce在文本分析、数据挖掘和网页索引等多个领域得到广泛应用。更重要的是,MapReduce降低了大数据技术的使用门槛,推动了数据处理效率的提升,并促进了大数据生态系统的发展,催生了诸如Hadoop等关键技术框架,为大数据的发展做出了深远的贡献。

数据飓风 1994

YOLOv11 模型改进:利用新型损失函数实现精度跃升(含代码全解析)

在目标检测领域,损失函数的选择直接决定模型的精度上限。某自动驾驶公司将 YOLOv11 原有损失替换为新型损失后,障碍物检测 mAP 提升 10%,夜间场景误检率降低 22%;某物流分拣项目中,采用新损失的 YOLOv11 模型对小包裹的识别准确率从 82% 升至 96%。如果你也在为模型精度瓶颈、样本不平衡问题困扰,这篇教程将带你掌握 YOLOv11 损失函数的进阶技巧,真正帮你在检测性能上实现突破。损失函数是模型训练的“指南针”,它定义了模型“学习的方向”。传统损失(如 BCE、Focal Loss)在

m0_71589036的博客 714

MapReduce: Simplified Data Processing on Large Clusters 翻译加理解

前言 这是真正的核心知识,将这篇论文阅读并翻译一遍。 MapReduce: 大型集群上的简化数据处理

秋叶红于二月花 5112

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3987

GitHub 国内加速完全指南(最新):镜像、代理与优化技巧

在国内使用 GitHub 时,经常遇到 clone 慢、打开仓库卡、GitHub Actions 不稳定 等问题。下面是整理好的 GitHub 国内镜像和加速方法大全,高效使用 GitHub。

moton2017的博客 1万+

对于MapReduce: Simplified Data Processing on Large Clusters 的理解

MapReduce: Simplified Data Processing on Large Clusters这个论文原版的没看,找了几个网上流传的翻译稿,认真看了一遍。因为内容主要为大数据方面,目前自己还没直接接触到这方面的内容,先记录一下收获,不然用到的时候都忘光了(见笑了。。) 先记录一下翻译比较好的文章,我自己看着逻辑上没啥大毛病的翻译稿(个人水平有限,别吐槽,见谅。。。): 第一个是...

yimuta9538的博客 2803

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《MapReduce: Simplified Data Processing on Large Clusters》译文

mapReduce是一个处理和生成海量数据集合的编程模型以及相关实现。用户需要声明一个map函数以及一个reduce函数,map函数处理(key, value)对,生成中间结果集,中间结果集也是(key, value)对;reduce函数合并中间结果集中相同的key对应的值。正如本文所述,此模型可以表示很多现实问题。

小白的博客 864

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【MapReduce】MapReduce:Simplified Data Processing on Large Clusters

文章目录摘要1、介绍2、编程模型2.1 示例3、实现3.1 执行概括3.2 master的数据结构3.3 容错3.3.1 worker故障3.3.2 master失败3.3.3 失效方面的处理机制3.4 存储位置3.5 任务粒度3.6 备用任务4、技巧4.1 分区函数设计4.2 顺序保证4.3 combiner函数4.4输入和输出的类型4.5 副作用4.6 跳过损坏的记录4.7 本地执行版本4.8...

Eternally123的博客 724

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

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

[论文笔记] MapReduce: Simplified Data Processing on Large Clusters

MapReduce 是一种用于处理和生成大型数据集的编程模型和相关实现 .用户指定一个处理键值对以生成一组中间键值对的mapmapmap函数, 以及一个合并与同一中间键关联的所有中间值的reducereducereduce函数.特点: 自动并行化并在大型集群上执行. 运行时系统负责对输入数据进行分区、调度程序执行、处理机器故障以及管理所需的机器间通信等细节.分布式计算的输入数据很大, 处理并行计算、分发数据和处理故障等分布式所具有的问题掩盖了原本问题的简单计算....

LostUnravel的博客 1430

[翻译]MapReduce: Simplified Data Processing on Large Clusters

MapReduce: Simplified Data Processing on Large Clusters MapReduce:面向大型集群的简化数据处理 摘要 MapReduce既是一种编程模型,也是一种与之关联的、用于处理和产生大数据集的实现。用户要特化一个map程序去处理key/value对,并产生中间key/value对的集合,以及一个reduce程序去合并有着相同key的所有中...

学到的就要教人 赚到的就要给人 518

分布式系统——MapReduce:Simplified Data Processing on Large Clusters论文

1.简要介绍 MapReduce:Simplified Data Processing on Large Clusters最初发表在2004年,本次分享的是2008年的版本,内容较2004版本进行了精简和补充。 在建立MapReduce之前,Google工程师会实现数百种特定的、大规模数据的计算,如:网上爬取文档,计算派生的数据(如数据图结构计算)等等。大多数此类计算在概念上是直截了当的,但是实现...

MyNuTh的博客 3727
上一篇: APUE第一章 UNIX基础知识
下一篇: memcached学习之总览
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值