年度归档:2017年

机器学习简介

大数据、人工智能是目前大家谈论比较多的话题,它们的应用也越来越广泛、与我们的生活关系也越来越密切,影响也越来越深远,其中很多已进入寻常百姓家,如无人机、网约车、自动导航、智能家电、电商推荐、人机对话机器人等等。
大数据是人工智能的基础,而使大数据转变为知识或生产力,离不开机器学习(Machine Learning),可以说机器学习是人工智能的核心,是使机器具有类似人的智能的根本途径。
本章主要介绍机器有关概念、与大数据、人工智能间的关系、机器学习常用架构及算法等,具体如下:
 机器学习的定义
 大数据与机器学习
 机器学习与、人工智能及深度学习
 机器学习的基本任务
 如何选择合适算法
 Spark在机器学习方面的优势

1.1机器学习的定义

机器学习是什么?是否有统一或标准定义?目前好像没有,即使在机器学习的专业人士,也好像没有一个被广泛认可的定义。在维基百科上对机器学习有以下几种定义:
“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”。
“机器学习是对能通过经验自动改进的计算机算法的研究”。
“机器学习是用数据或以往的经验,以此优化计算机程序的性能标准。”
一种经常引用的英文定义是:A computer program is said to learn from experience (E) with respect to some class of tasks( T) and performance(P) measure , if its performance at tasks in T, as measured by P, improves with experience E。
可以看出机器学习强调三个关键词:算法、经验、性能,其处理过程如图1-1所示。

图1-1 机器学习处理流程
上图表明机器学习是使数据通过算法构建出模型,然后对模型性能进行评估,评估后的指标,如果达到要求就用这个模型测试新数据,如果达不到要求就要调整算法重新建立模型,再次进行评估,如此循环往复,最终获得满意结果。

1.2大数据与机器学习

我们已进入大数据时代,产生数据的能力空前高涨,如互联网、移动网、物联网、成千上万的传感器、穿戴设备、GPS等等,存储数据、处理数据等能力也得到了几何级数的提升,如Hadoop、Spark技术为我们存储、处理大数据提供有效方法。
数据就是信息、就是依据,其背后隐含了大量不易被我们感官识别的信息、知识、规律等等,如何揭示这些信息、规则、趋势,正成为当下给企业带来高回报的热点。
而机器学习的任务,就是要在基于大数据量的基础上,发掘其中蕴含并且有用的信息。其处理的数据越多,机器学习就越能体现出优势,以前很多用机器学习解决不了或处理不好的问题,通过提供大数据得到很好解决或性能的大幅提升,如语言识别、图像设别、天气预测等等。

1.3 机器学习、人工智能及深度学习

人工智能和机器学习这两个科技术语如今已经广为流传,已成为当下的热词,
然而,他们间有何区别?又有哪些相同或相似的地方?虽然人工智能和机器学习高度相关,但却并不尽相同。
人工智能是计算机科学的一个分支,目的是开发一种拥有智能行为的机器,目前
很多大公司都在努力开发这种机器学习技术。他们都在努力让电脑学会人类的行为模式,
以便推动很多人眼中的下一场技术革命——让机器像人类一样“思考”。
过去10年,机器学习已经为我们带来了无人驾驶汽车、实用的语音识别、有效的网络搜索等等。接下来人工智能将如何改变我们的生活?在哪些领域最先发力?我们拭目以待。
对很多机器学习来说,特征提取不是一件简单的事情。在一些复杂问题上,
要想通过人工的方式设计有效的特征集合,往往要花费很多的时间和精力。
深度学习解决的核心问题之一就是自动地将简单的特征组合成更加复杂的特征,并利用这些组合特征解决问题。深度学习是机器学习的一个分支,它除了可以学习特征和任务之间的关联以外,还能自动从简单特征中提取更加复杂的特征。图1-2 中展示了深度学习和传统机器学习在流程上的差异。如图1-2 所示,深度学习算法可以从数据中学习更加复杂的特征表达,使得最后一步权重学习变得更加简单且有效。

图1-2 机器学习与深度学习流程对比

前面我们分别介绍了机器学习、人工智能及深度学习,它们间的关系如何?

图1-3 人工智能、机器学习与深度学习间的关系

人工智能、机器学习和深度学习是非常相关的几个领域。图1-3说明了它们之间大致关系。人工智能是一类非常广泛的问题,机器学习是解决这类问题的一个重要手段,深度学习则是机器学习的一个分支。在很多人工智能问题上,深度学习的方法突破了传统机器学习方法的瓶颈,推动了人工智能领域的快速发展。

1.4机器学习的基本任务

机器学习基于数据,并以此获取新知识、新技能。它的任务有很多,分类是其基本任务之一。分类就是将新数据划分到合适的类别中,一般用于类别型的目标特征,如果目标特征为连续型,则往往采用回归方法。回归是对新目标特征进行预测,是机器学习中使用非常广泛的方法之一。
分类和回归,都是先根据标签值或目标值建立模型或规则,然后利用这些带有目标值的数据形成的模型或规则,对新数据进行识别或预测。这两种方法都属于监督学习。与监督学习相对是无监督学习,无监督学习不指定目标值或预先无法知道目标值,它可以将把相似或相近的数据划分到相同的组里,聚类就是解决这一类问题的方法之一。
除了监督学习、无监督学习这两种最常见的方法外,还有半监督学习、强化学习等方法,这里我们就不展开了,图1-4展示了这些基本任务间的关系。

图1-4机器学习基本任务的关系

1.5如何选择合适算法

当我们接到一个数据分析或挖掘的任务或需求时,如果希望用机器学习来处理,首要任务是根据任务或需求选择合适算法,选择哪种算法较合适?分析的一般步骤为:

图1-5选择算法的一般步骤

充分了解数据及其特性,有助于我们更有效地选择机器学习算法。采用以上步骤在一定程度上可以缩小算法的选择范围,使我们少走些弯路,但在具体选择哪种算法方面,一般并不存在最好的算法或者可以给出最好结果的算法,在实际做项目的过程中,这个过程往往需要多次尝试,有时还要尝试不同算法。不过先用一种简单熟悉的方法,然后,在这个基础上不断优化,时常能收获意想不到的效果。

1.6 Spark在机器学习方面的优势

在大数据上进行机器学习,需要处理全量数据并进行大量的迭代计算,这要求机器学习平台具备强大的处理能力。Spark与Hadoop兼容,它立足于内存计算,天然的适应于迭代式计算,Spark是一个大数据计算平台,在这个平台上,有我们大家熟悉的SQL式操作组件Spark SQL;功能强大、性能优良的机器学习库Spark MLlib;还有图像处理的Spark Graphx及用于流式处理的Spark Streaming等,具体有以下优势:
 完整的大数据生态系统:我们大家熟悉的SQL式操作组件Spark SQL,还有功能强大、性能优良的机器学习库Spark MLlib、图像计算的SparkGraphx及用于流式处理的SparkStreaming等。
 高性能的大数据计算平台:因为数据被加载到集群主机的分布式内存中。数据可以被快速的转换迭代,并缓存后续的频繁访问需求。基于内存运算,Spark可以比Hadoop快100倍,在磁盘中运算也比hadoop快10倍左右。
 与Hadoop、Hive、HBase等无缝连接:Spark可以直接访问Hadoop、Hive、Hbase等的数据,同时也可使用Hadoop的资源管理器。
 易用、通用、好用:Spark编程非常高效、简洁,支持多种语言的API,如Scala、Java、Python、R、SQL等,同时提供类似于shell的交互式开发环境REPL。

1.7小结

本章简单介绍了机器学习与大数据,与人工智能的关系。同时也介绍了机器学习的一些基本任务和如何选择合适算法等问题,在选择机器学习平台时,这里我们介绍了Spark这样一个大数据平台的集大成者,它有很多优势,而且也得到越来越多企业的青睐,当然也是我们这本书主题介绍的内容,下一章我们介绍如何构建一个Spark机器学习系统。

资料库历史信息

深度学习500问(github有41K star)
30天吃掉那只TensorFlow2或PyTorch(github有近9k star)
文本检测与识别(OCR)资源汇总
知识图谱怎么与深度学习结合?
2019->2020必看的十篇「深度学习领域综述」论文
90行Python代码让微信地球转起来!
BERT、GPT、GPT-2、Transformer-XL、XLNET等20多种预训练模型随便用!(github 有37K Star)
tensorflow2.0 google工程普通话讲解
利用网络上公开的数据构建一个小型的证券知识图谱
【[千锋教育】Python 从入门到入坟 900集(学完可就业2019版)
贪心学院NLP+DL+ML+Python等400多个视频
XLNet:运行机制及和Bert的异同比较

大白话解读“中台“
linux系列之常用运维命令整理笔录
21个必须知道的机器学习开源工具
一张贴纸破解顶级FaceID,华为新研究让人脸识别不再安全
语音识别开源工具PyTorch-Kaldi:兼顾Kaldi效率与PyTorch灵活性
Adam作者大革新,联合Hinton等人推出全新优化方法Lookahead
Python 3.8 即将到来,这是你需要关注的几大新特性
谷歌开源强化学习深度规划网络 PlaNet
图神经网络简介(深度学习的新热点)
强烈推荐的TensorFlow、Pytorch和Keras的样例资源(尤其适合深度学习初学者)
2018年下半年,别错过这些深度学习项目!
台湾大学李宏毅教授的深度学习课程
谷歌带来GAN入门神器:浏览器上运行的可视化工具GAN Lab
超级大汇总!200多个最好的机器学习、NLP和Python教程
近日,吴恩达接受澎湃新闻专访,对工智能教育、人工智能产业、人工智能前景等13个不同层面的问题,进行了全方位的深度解析
阿里发布免费深度学习课程
MIT6.S094深度学习自动驾驶第一讲(3)
LSTM之父最新力作:手把手教你训练一个有世界观的AI赛车手
手把手 | Python代码和贝叶斯理论告诉你,谁是最好的棒球选手
一文打尽人工智能和机器学习网络资源
Google上线自带中文的机器学习免费系列视频!!!--含实际案例分析和实践练习
手把手:自然语言处理太难?按这个套路走,就是砍瓜切菜!(附Python代码)
吴恩达深度学习笔记
吴恩达第五课RNN视频--中文讲解
吴恩达113个机器学习视频--中文字幕
别错过这张AI商用清单:你的生产难题可能被一个应用解决
手把手:用Python搭建机器学习模型预测黄金价格
科大讯飞最新语音识别系统和框架深度剖析
语音识别的技术原理是什么?
通过python爬取东方财富股吧数据,分析股民情绪对股市的影响
一文概览深度学习中的五大正则化方法和七大优化策略
莫烦Python|TensorFlow系列视频【内容系统、详细--强力推荐】
机器学习深度学习资料大汇总
超实用总结:AI实践者需要用到的10个深度学习方法
手把手|用TensorFlow开发问答系统
手动调参太慢,随机搜索太浪费资源?Deepmind异步优化算法PBT有望解决神经网络痛点
项目实战:如何构建知识图谱
为个人深度学习机器选择合适的配置
手把手:用OpenCV亲手给小扎、Musk等科技大佬们做一张“平均脸”(附Python代码)
机器学习实战
学习神经网络系列视频
零基础入门深度学习
极客学院--深度学习
机器学习&人工智能博文链接汇总
《深度学习》英文原版
下载《深入浅出TensorFlow》
TensorFlow初学者55个经典案例

一、绪论:

R语言是什么?

R是一种适用于统计分析计算和图像处理的语言.受S语言和Scheme语言影响发展而来.早期R是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作任何修改的在R环境下运行。R的语法是来自Scheme.

R语言如何而来的?

R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman

开发.[因两人名字都是以R 开头 所以也因此形象称为R]

二、基础知识:

1、数据结构(矩阵,数据框,向量,列表)

#定义一个向量并且使用class查看他的属性:

> d <-class(d)
[1] "numeric"

我们看到是数字型的。
#再定义一个向量:

> c<- class(c)
[1] "character"

由于4外面打了引号,所以向量属性是字符型。
我们可以把他转成数值型:

> class(c)<-"numeric"
> c
[1] 1 2 3 4

就变成数值了
试试下面的四则混合运算(疑问:2者长度不一样,怎么计算出来的?可以尝试观察下):
d+c
d-c
d*c
d/c
#定义一个矩阵

>M <-matrix(1:9,nrow=3,ncol=3)
>M
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

#按行填充

>N <-matrix(1:9,nrow=3,ncol=3,byrow=T)
>N
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9

仔细观察下上面两者写法和结果的差别。
动手试试看下面的矩阵乘法:
M*N
M%*%N
#定义一个list

> D <-{}
> D[[1]]<-c(1,2,3)
> D[[2]]<-c(2,3,4)
> D[[3]]<-matrix(1:6,nrow=2)
> D
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3 4

[[3]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

#定义序列

> G1 <-seq(from=1,to=9,by=1 )
> G2 G3<-rep(c(1,2),2)
> G1
[1] 1 2 3 4 5 6 7 8 9
> G2
[1] 1 2 3 4 5 6 7 8 9
> G3
[1] 1 2 1 2

#读入数据
read.table("路径",header=FALSE,stringsAsFactors=TRUE,fill=TRUE)

2.Apply函数簇和长宽报表转换

#定义矩阵

> N<-matrix(1:9,nrow=3,ncol=3,byrow=T)
> N
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9

动手试试看:
#按行求和
apply(N,1,sum)
#按列求均值
apply(N,2,mean)
#按列求标准差
apply(N,2,sd)
#按列排序
apply(N,2,sort)
#导入R里面的数据集iris
data(iris)
iris
#用apply函数簇,求每种花的花瓣总长度
tapply(iris$Sepal.Length,iris$Species,sum)
#求每种花瓣,花鄂的标准差
sapply(1:(ncol(iris)-1),function(x) sd(iris[,x]))
apply(iris,2,sd)

#长宽表转换(需要导入reshape和reshape2包)
#### source("http://bioconductor.org/biocLite.R")
#### biocLite()
####
library(reshape)
library(reshape2)
data_reshape 借款周期=c(7,10,14,8,10,12))
data2 data3 data3 colnames(data3) <-c("客户ID","借款金额","借款时间","借款周期")
结果如下:

1.TensorFlow简介
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即Tensor(张量),而Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow不只局限于神经网络,其数据流式图支持非常自由的算法表达,当然也可以轻松实现深度学习以外的机器学习算法。事实上,只要可以将计算表示成计算图的形式,就可以使用TensorFlow。TensorFlow可被用于语音识别或图像识别等多项机器深度学习领域,TensorFlow一大亮点是支持异构设备分布式计算,它能够在各个平台上自动运行模型,从手机、单个CPU / GPU到成百上千GPU卡组成的分布式系统。

2、TensorFlow安装
安装TensorFlow,因本环境的python3.6采用anaconda来安装,故这里采用conda管理工具来安装TensorFlow,目前conda缺省安装版本为TensorFlow1.2。

conda install tensorflow

验证安装是否成功,可以通过导入tensorflow来检验。
启动ipython(或python)

import tensorflow as tf

测试测试TensorFlow,Jupyter Notebook及matplotlib

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

##通知笔记本将matplotlib图表直接显示在浏览器上
%matplotlib inline

a=tf.random_normal([2,40]) ###随机生成一个2x40矩阵
sess=tf.Session() ####启动session,并赋给一个sess对象
out=sess.run(a) ###执行对象a,并将输出数组赋给out
x,y=out ###将out这个2x40矩阵划分为两个1x40的向量x,y
plt.scatter(x,y) ###利用scatter绘制散点图
plt.show()

3、TensorFlow的发展
2015年11月9日谷歌开源了人工智能系统TensorFlow,同时成为2015年最受关注的开源项目之一。TensorFlow的开源大大降低了深度学习在各个行业中的应用难度。TensorFlow的近期里程碑事件主要有:
2016年04月:发布了分布式TensorFlow的0.8版本,把DeepMind模型迁移到TensorFlow;
2016年06月:TensorFlow v0.9发布,改进了移动设备的支持;
2016年11月:TensorFlow开源一周年;
2017年2月:TensorFlow v1.0发布,增加了Java、Go的API,以及专用的编译器和调试工具,同时TensorFlow 1.0引入了一个高级API,包含f.layers,tf.metrics和tf.losses模块。还宣布增了一个新的tf.keras模块,它与另一个流行的高级神经网络库Keras完全兼容。
2017年4月:TensorFlow v1.1发布,为Windows 添加 Java API 支,添加tf.spectral 模块,Keras 2 API等;
2017年6月:TensorFlow v1.2发布,包括 API 的重要变化、contrib API的变化和Bug 修复及其它改变等。

4、TensorFlow的特点
高度的灵活性
TensorFlow 采用数据流图,用于数值计算的开源软件库。只要计算能表示为一个数据流图,你就可以使用Tensorflow。
真正的可移植性
Tensorflow 在CPU和GPU上运行,可以运行在台式机、服务器、云服务器、手机移动设备、Docker容器里等等。
将科研和产品联系在一起
过去如果要将科研中的机器学习想法用到产品中,需要大量的代码重写工作。Tensorflow将改变这一点。使用Tensorflow可以让应用型研究者将想法迅速运用到产品中,也可以 让学术性研究者更直接地彼此分享代码,产品团队则用Tensorflow来训练和使用计算模 型,并直接提供给在线用户,从而提高科研产出率。
自动求微分
基于梯度的机器学习算法会受益于Tensorflow自动求微分的能力。使用Tensorflow,只 需要定义预测模型的结构,将这个结构和目标函数(objective function)结合在一起,并添加数据,Tensorflow将自动为你计算相关的微分导数。
多语言支持
Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/c++程序,也可以用交互式的Ipython界面来用Tensorflow尝试这些想法,也可以使用Go,Java,Lua,Javascript,或者是R等语言。
性能最优化
如果你有一个32个CPU内核、4个GPU显卡的工作站,想要将你工作站的计算潜能全发挥出来,由于Tensorflow 给予了线程、队列、异步操作等以最佳的支持,Tensorflow 让你可以将你手边硬件的计算潜能全部发挥出来。你可以自由地将Tensorflow图中的计 算元素分配到不同设备上,充分利用这些资源。下表为TensorFlow的一些主要技术特征:

5、TensorFlow的编程模式
TensorFlow是一个采用数据流图(Data Flow Graphs),节点(Nodes)在图中表示数学操作,图中的边(edges)则表示在节点间相互联系的任何维度的数据数组,即张量(tensor)。数据流图用结点(nodes)和边(edges)的有向无环图(DAG)来描述数学计算。节点一般用来表示施加的数学操作(tf.Operation),但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。边表示节点之间的输入/输出关系。这些数据“边”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。

Tensorflow中的计算可以表示为一个有向图(directed graph),或称计算图(computation graph),其中每一个运算操作将作为一个节点(node),节点与节点之间的连接成为边(edge),而在计算图的边中流动(flow)的数据被称为张量(tensor),所以形象的看整个操作就好像数据(tensor)在计算图(computation graphy)中沿着边(edge)流过(flow)一个个节点(node),这就是tensorflow名字的由来的。

saddle_point_evaluation_optimizers

计算图中的每个节点可以有任意多个输入和任意多个输出,每个节点描述了一种运算操作(operation, op),节点可以算作运算操作的实例化(instance)。计算图描述了数据的计算流程,它也负责维护和更新状态,用户可以对计算图的分支进行条件控制或循环操作。用户可以使用pyton、C++、Go、Java等语言设计计算图。tensorflow通过计算图将所有的运算操作全部运行在python外面,比如通过c++运行在cpu或通过cuda运行在gpu 上,所以实际上python只是一种接口,真正的核心计算过程还是在底层采用c++或cuda在cpu或gpu上运行。

一个 TensorFlow图描述了计算的过程. 为了进行计算, 图必须在会话(session)里被启动. 会话将图的op分发到诸如CPU或GPU之的备上, 同时提供执行op的方法. 这些方法执行后, 将产生的tensor返回. 在Python语言中, 返回的tensor是numpy ndarray对象; 在C和C++语言中, 返回的tensor是tensorflow::Tensor实例。

从上面的描述中我们可以看到,tensorflow的几个比较重要的概念:tensor, computation graphy, node, session。正如前面所说,整个操作就好像数据(tensor)在计算图(computation graphy)中沿着边(edge)流过(flow)一个个节点(node),然后通过会话(session)启动计算。所以简单来说,要完成这整个过程,我们需要的东西是要定义数据、计算图和计算图上的节点,以及启动计算的会话。所以在实际使用中我们要做的大部分工作应该就是定义这些内容了。

6、TensorFlow实例
TensorFlow如何工作?我们通过一个简单的实例进行说明,为计算x+y,你需要创建下图这张数据流图


以下构成上数据流图的详细步骤:
1)定义x= [1,3,5],y =[2,4,7],这个图和tf.Tensor一起工作来代表数据的单位,你需要创建恒定的张量:

import tensorflow as tf
x = tf.constant([1,3,5])
y = tf.constant([2,4,7])

2)定义操作

op = tf.add(x,y)

3)张量和操作都有了,接下来就是创建图

my_graph = tf.Graph()

这一步非必须,在创建回话时,系统将自动创建一个默认图。
4)为了运行这图你将需要创建一个回话(tf.Session),一个tf.Session对象封装了操作对象执行的环境,为了做到这一点,我们需要定义在会话中将要用到哪一张图:

with tf.Session(graph=my_graph) as sess:
x = tf.constant([1,3,5])
y = tf.constant([2,4,7])
op = tf.add(x,y)

5)想要执行这个操作,要用到tf.Session.run()这个方法:

import tensorflow as tf
my_graph = tf.Graph()
with tf.Session(graph=my_graph) as sess:
x = tf.constant([1,3,5])
y = tf.constant([2,4,7])
op = tf.add(x,y)
result = sess.run(fetches=op)
print(result)

6)运行结果:
[ 3 7 12]

7、几乎所有深度框架都是基于计算图,计算图可分为静态计算图和动态计算图。静态计算图,先定义再运行,一次定义多次运行;动态计算图在运行过程中被定义,在运行中构建,可以多次构建多次运行。Tensorflow属于静态图,先构造图形,然后创建sess,最后run。这里我们介绍深度学习另一种框架Pytorch,它属于动态图形,每步生成图的一部分,最后把图组合起来,形成一个完整图形,具体可参考下图。

saddle_point_evaluation_optimizers

以上动态图对应的代码为:

第一部分 Python基础
第1章、Numpy常用操作
第2章、Theano基础
第3章、Python知识图谱
第二部分 Python数据分析
第1章、Pandas基础
第2章、 操作数据库
第3章、数据处理
第4章、用Python分析股票数据
第5章、电信客户流失分析

第三部分 数据可视化

第四部分 爬虫
第1章、Scrapy基础
第2章、利用Python抓取并分析京东商品评论数据
第3章、Python 爬虫入门实例
第4章、 Scarpy 爬虫入门实例

第五部分 Web开发

第六部分 Python与机器学习

第1章、机器学习简介
第2章、机器学习一般流程
第3章、机器学习简单示例
第4章、Scikit-learn简介
第5章、数据探索和预处
第6章、模型评估与参数优化
第7章、集成学习
第8章、航空公司客户价值分析实例
第9章、自然语言处理----情感分析实例
第10章、聚类算法及实例
第11章、神奇的SVM及实例分析
第12章、化繁为简的高手----正则化方法
第13章、神经网络简介
第14章、由浅入深--轻松学会--用Python实现神经网络
第15章、K-means聚类
第16章、回归模型(分别用解方程、迭代、自动求导等方法求参数)
第17章、多种降维方法
第18章、Kaggle竞赛神器--集成学习
第19章、深度学习首先方法:Jupyter NoteBook
第20章、深度学习框架Pytorch快速入门
第21章、TensorFlow的又一利器TensorFlow.js(基于浏览器开发测试机器学习)
第22章、神经网络黑箱不黑
第23章、神经风格迁移
第24章、轻松掌握深度学习的核心--误差反向传播法
第25章、Pytorch如果高效使用GPU加速
第26章、用预训练模型清除图像中的雾霾

第七部分 Python与深度学习
###应用数学基础###
第1章 线性代数
第2章 概率与信息论
第3章 概率图模型
###深度学习理论与应用###
第4章 机器学习基础
4.1简介
4.2监督学习
4.3无监督学习
4.4神经网络
4.5随机梯度下降
4.6参数估计
4.7Sklearn简介

第5章 深度学习挑战及方案
5.1 梯度下降与最优化
第6章 安装TensorFlow
第7章 TensorFlow基础
第8章 TensorFlow图像处理
第9章 TensorFlow实现神经元函数
第10章 TensorFlow自编码
第11章 TensorFlow 实现word2vec
第12章 TensorFlow 卷积神经网络
第13章 TensorFlow 循环神经网络
第14章 TensorFlow 高级封装
###深度学习实战(使用TensorFlow实现)###
第15章 情感分析
第16章 自动生成文章摘要
第17章 聊天机器人
第18章 人脸识别
第19章 乳腺癌识别
第20章 信用卡欺诈检测
第21章 自然语言处理
第22章 强化学习
第23章 生成式对抗网络
第24章 语音识别基础
第25章 自动驾驶汽车--使汽车在两条白线之间行驶
第26章 自动驾驶汽车--交通标志识别

第八部分 爬虫+文件处理+科学计算+机器学习等

第1章 机器学习简介
1.1机器学习的定义
1.2大数据与机器学习
1.3 机器学习、人工智能及深度学习
1.4 机器学习的基本任务
1.5 如何选择合适算法
1.6 Spark在机器学习方面的优势
1.7 小结
第2章 构建Spark机器学习系统
2.1机器学习系统架构
2.2启动集群
2.3加载数据
2.4探索数据
2.4.1 数据统计信息
2.4.2 数据质量分析
2.4.3 数据特征分析
2.4.3.1 数据特征分析
2.4.3.2 特征分布及相关性分析
2.4.3.3 对比分析
2.4.4 数据的可视化
2.5数据预处理
2.5.1数据清理
2.5.2数据变换
2.5.3数据集成
2.5.4数据归约
2.6构建模型
2.7模型评估
2.8组装
2.9模型选择或调优
2.9.1 交叉验证(CrossValidator)
2.9.2训练-验证切分(TrainValidationSplit)
2.10保存模型
2.11小结
第3章 ML Pipelines
3.1 Pipeline简介
3.2DataFrame
3.3 Pipeline组件
3.4 Pipeline原理
3.5 Pipeline实例
3.5.1使用Estimator, Transformer, and Param实例
3.5.2 ML使用Pipeline实例
3.6 小结
第4章 特征提取、转换和选择
4.1 特征提取
4.1.1 词频-逆向文件频率(TF-IDF)
4.1.2 Word2Vec
4.1.3 计数向量器(Countvectorizer)
4.2 特征转换
4.2.1分词器(Tokenization)
4.2.2 移除停用词(StopWordsRemover)
4.2.3 n-gram
4.2.4 二值化
4.2.5 主成分分析(PCA)
4.2.6 多项式展开(PolynomialExpansion)
4.2.7 离散余弦变换(DCT)
4.2.8 字符串-索引变换(StringIndexer)
4.2.9 索引-字符串变换(IndexToString)
4.2.10 独热编码(OneHotEncoder)
4.2.11 向量-索引变换
4.2.12交互式(Interaction)
4.2.13 正则化(Normalizer)
4.2.14 规范化(StandardScaler)
4.2.15 最大值-最小值缩放(MinMaxScaler)
4.2.16 最大值-绝对值缩放(MaxAbsScaler)
4.2.17 离散化重组(Bucketizer)
4.2.18 元素乘积(ElementwiseProduct)
4.2.19 SQL转换器(SQLTransformer)
4.2.20 向量汇编(VectorAssembler)
4.2.21 分位数离散化(QuantileDiscretizer)
4.3 特征选择
4.3.1 向量机(VectorSlicer)
4.3.2 R公式(RFormula)
4.3.3 卡方特征选择(ChiSqSelector)
4.4 小结
第5章 模型选择和优化
5.1 模型选择
5.2交叉验证(cross-validation)
5.3训练验证拆分法(train validation split)
5.4自定义模型选择
5.5小结
第6章 Spark MLlib简介
6.1 Spark MLlib简介
6.2 Spark MLlib架构
6.3 数据类型
6.4 基础统计
6.4.1摘要统计(summary statistics)
6.4.2相关性(correlations)
6.4.3假设检验(hypothesis testing)
6.4.4随机数据生成(random data generation)
6.5 RDD、Dataframe和Dataset
6.5.1 RDD
6.5.2Dataset/DataFrame
6.5.3相互转换
6.6 小结
第7章 构建Spark ML推荐模型
7.1 推荐模型简介
7.2 数据加载
7.3 数据探索
7.4 训练模型
7.5 组装
7.6 评估模型
7.7 模型优化
7.8小结
第8章构建Spark ML 分类模型
8.1分类模型简介
8.1.1线性模型
8.1.2 决策树模型
8.1.3 朴素贝叶斯模型
8.2数据加载
8.3 数据探索
8.4数据预处理
8.5组装
8.6模型优化
8.7小结
第9章 构建Spark ML回归模型
9.1 回归模型简介
9.2 数据加载
9.3 探索特征分布
9.4 数据预处理
9.4.1 特征选择
9.4.2 特征转换
9.5 组装
9.6 模型优化
9.7 小结
第10章 构建Spark ML聚类模型
10.1 K-means模型简介
10.2 数据加载
10.3 探索特征的相关性
10.4 数据预处理
10.5 组装
10.6 模型优化
10.7 小结
第11章 PySpark 决策树模型
11.1 PySpark 简介
11.2 决策树简介
11.3数据加载
11.3.1 原数据集初探
11.3.2 PySpark 的启动
11.3.3 基本函数
11.4数据探索
11.5数据预处理
11.6创建决策树模型
11.7训练模型进行预测
11.8模型优化
11.8.1特征值的优化
11.8.2交叉验证和网格参数
11.9脚本方式运行
11.9.1 在脚本中添加配置信息
11.9.2运行脚本程序
11.10小结
第12章 Spark R 朴素贝叶斯模型
12.1. Spark R简介
12.2. 获取数据
12.2.1. SparkDataFrame数据结构说明
12.2.2. 创建Spark DataFrame
12.2.3. SparkDataFrame的常用操作
12.3. 朴素贝叶斯分类器
12.3.1数据探查
12.3.2对原始数据集进行转换
12.3.3查看不同船舱的生还率差异
12.3.4转换成Spark DataFrame格式的数据
12.3.4模型概要
12.3.5预测
12.3.6评估模型
12.4 小结
第13章 使用Spark Streaming构建在线学习模型
13.1 Spark Streaming简介
13.1.1Spark Streaming常用术语
13.1.2Spark Streaming处理流程
13.2 Dstream操作
13.2.1 Dstream输入
13.2.2 Dstream转换
13.2.3 Dstream修改
13.2 .4Dstream输出
13.3 Spark Streaming应用实例
13.4 Spark Streaming在线学习实例
13.5小结
第14章 TensorFlowOnSpark简介
14.1TensorFlow简介
14.1.1TensorFlow的安装
14.1.2TensorFlow的发展
14.1.3TensorFlow的特点
14.1.4TensorFlow编程模型
14.1.5TensorFlow常用函数
14.1.6TensorFlow的运行原理
14.1.7TensorFlow系统架构
14.2TensorFlow实现卷积神经网络
14.2.1卷积神经网络简介
14.2.2卷积神经网络的发展历程
14.2.3卷积神经网络的网络结构
14.2.4TensorFlow实现卷积神经网络
14.3TensorFlow实现循环神经网络
14.3.1循环神经网络简介
14.3.2 LSTM循环神经网络简介
14.3.3 LSTM循环神经网络分步说明
14.3.4TensorFlow实现循环神经网络
14.4分布式TensorFlow
14.4.1客户端、主节点和工作节点间的关系
14.4.2分布式模式
14.4.3在Pyspark集群环境运行TensorFlow
14.5TensorFlowOnSpark架构
14.6TensorFlowOnSpark安装
14.7TensorFlowOnSpark实例
14.7.1TensorFlowOnSpark单机模式实例
14.7.2TensorFlowOnSpark集群模式实例
14.8小结

第1章 为什么要自己动手做大数据系统(略)
第2章 项目背景及准备(略)

项目总体框架图,从数据获取->数据存储->数据处理->数据分析与展示
第3章 大数据环境搭建和配置
3.1 各组件功能说明
3.1.1 各种数据源的采集工具
3.1.2 企业大数据存储工具
3.1.3 企业大数据系统的数据仓库工具
3.1.4 企业大数据系统的分析计算工具
3.1.5 企业大数据系统的数据库工具
3.2 大数据系统各组件安装部署配置
3.2.1 安装的前期准备工作
3.2.2 Hadoop基础环境安装及配置
3.2.3 Hive安装及配置
3.2.4 Sqoop安装及配置
3.2.5 Spark安装及配置
3.2.6 Zookeeper安装及配置
3.2.7 HBase安装及配置
3.3 自动化安装及部署说明
3.3.1 自动化安装及部署整体架构设计
3.3.2 大数据系统自动化部署逻辑调用关系
3.4 本章小结
第4章 大数据的获取
4.1 使用爬虫获取互联网数据
4.2 Python和Scrapy 框架的安装
4.3 抓取和解析招聘职位信息
4.4 职位信息的落地
4.5 两个爬虫配合工作
4.6 让爬虫的架构设计更加合理
4.7 获取数据的其他方式
4.8 使用Sqoop同步论坛中帖子数据
4.9 本章小结
第5章 大数据的处理
5.1 Hive是什么
5.2 为什么使用Hive做数据仓库建模
5.3 飞谷项目中Hive建模步骤
5.3.1 逻辑模型的创建
5.3.2 物理模型的创建
5.3.3 将爬虫数据导入stg_job表
5.4 使用Hive进行数据清洗转换
5.5 数据清洗转换的必要性
5.6 使用HiveQL清洗数据、提取维度信息
5.6.1 使用HQL清洗数据
5.6.2 提取维度信息
5.7 定义Hive UDF封装处理逻辑
5.7.1 Hive UDF的开发、部署和调用
5.7.2 Python版本的UDF
5.8 使用左外连接构造聚合表rpt_job
5.9 让数据处理自动调度
5.9.1 HQL的几种执行方式
5.9.2 Hive Thrift服务
5.9.3 使用JDBC连接Hive
5.9.4 Python调用HiveServer服务
5.9.5 用crontab实现的任务调度
5.10 本章小结
第6章 大数据的存储
6.1 NoSQL及HBase简介
6.2 HBase中的主要概念
6.3 HBase客户端及JavaAPI
6.4 Hive数据导入HBase的两种方案
6.4.1 利用既有的JAR包实现整合
6.4.2 手动编写MapReduce程序
6.5 使用Java API查询HBase中的职位信息
6.5.1 为什么是HBase而非Hive
6.5.2 多条件组合查询HBase中的职位信息
6.6 如何显示职位表中的某条具体信息
6.7 本章小结
第7章 大数据的展示
7.1 概述
7.2 数据分析的一般步骤
7.3 用R来做数据分析展示
7.3.1 在Ubuntu上安装R
7.3.2 R的基本使用方式
7.4 用Hive充当R的数据来源
7.4.1 RHive组件
7.4.2 把R图表整合到Web页面中
7.5 本章小结
第8章 大数据的分析挖掘
8.1 基于Spark的数据挖掘技术
8.2 Spark和Hadoop的关系
8.3 在Ubuntu上安装Spark集群
8.3.1 JDK和Hadoop的安装
8.3.2 安装Scala
8.3.3 安装Spark
8.4 Spark的运行方式
8.5 使用Spark替代Hadoop Yarn引擎
8.5.1 使用spark-sql查看Hive表
8.5.2 在beeline客户端使用Spark引擎
8.5.3 在Java代码中引用Spark的ThriftServer
8.6 对招聘公司名称做全文检索
8.6.1 从HDFS数据源构造JavaRDD
8.6.2 使用Spark SQL操作RDD
8.6.3 把RDD运行结果展现在前端
8.7 如何把Spark用得更好
8.8 SparkR组件的使用
8.8.1 SparkR的安装及启动
8.8.2 运行自带的Sample例子
8.8.3 利用SparkR生成职位统计饼图
8.9 本章小结

第5章 Spark入门
Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,2014年至2015年,Spark经历了高速发展,Databricks 2015 Spark调查报告显示:2014年9月至2015年9月,已经有超过600个Spark源码贡献者,而在此之前的12个月人数只有315,Spark超越Hadoop,无可争议地成为大数据领域内最活跃的开源项目。除此之外,已经有超过200个公司为Spark奉献过源代码,使Spark社区成为迄今为止开发人员参与最多的社区。
Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark SQL、Spark Streaming、MLLib和GraphX等组件,也就是BDAS(伯克利数据分析栈),这些组件逐渐形成大数据处理一站式解决平台。
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集(Scala 提供一个称为 Actor 的并行模型,其中Actor通过它的收件箱来发送和接收非同步信息而不是共享数据,该方式被称为:Shared Nothing 模型)。在Spark官网上介绍,它具有运行速度快、易用性好、通用性强和随处运行等特点。
 运行速度快
Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。

 易用性好
Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写,特别是Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
 通用性强
Spark生态圈包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等组件,这些组件分别处理Spark Core提供内存计算框架、SparkStreaming的实时处理应用、Spark SQL的即席查询、MLlib或MLbase的机器学习和GraphX的图处理,它们无缝集成于Spark平台。
 随处运行
Spark具有很强的适应性,能够读取HDFS、HBase、S3和Techyon等的数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算。

5.1 Spark架构及原理
进入交换式编程界面,在之前的Spark版本中,Spark shell会自动创建一个SparkContext对象sc。2.0中Spark shell则会自动创建一个SparkSession对象(spark),在输入spark时就会发现它已经存在了。下图说明了SparkContext在Spark中的主要功能。

从图中可以看到SparkContext起到的是一个中介的作用,通过它来使用Spark其他的功能。每一个JVM都有一个对应的SparkContext,Driver program通过SparkContext连接到集群管理器来实现对集群中任务的控制。Spark配置参数的设置以及对SQLContext、HiveContext和StreamingContext的控制也要通过SparkContext。不过在Spark2.0中上述的一切功能都是通过SparkSession来完成的,同时SparkSession也简化了DataFrame/Dataset API的使用和对数据的操作。SparkSession成为Spark的一个全新的切入点。

5.2 Spark SQL简介
Spark Sql 的前身是shark,最初是用来查询Hive,Hive是为熟悉数据库,但不熟悉MapReduce的开发人员提供的工具,Hive提供可以对数据进行提取转化和加载(简称ETL)功能,通过Hive工具可以查询分析存储在Hadoop上的大规模数据。Hive定义了简单的查询语言HQL(类SQL),可以把SQL操作转成MapReduce任务。
MapReduce的计算过程消耗大量的IO,降低了运行效率,为了提高查询Hadoop上的数据的效率,出现了很多工具,如Impla 和shark等,其中Shark是spark的生态组件之一,它复用了Hive的SQL解析等组件,修改了内存管理,物理计划、执行模块,使它能够运行在Spark的计算引擎上,使用SQL的查询速度有了10-100倍的提升。
随着shark的发展,shark对Hive的依赖限制了其发展,包括语法解析器和查询优化器。Spark团队汲取了shark的优点重新设计了Spark SQL,使之在数据兼容、性能优化、组件扩展等方面得到极大的提升。
 数据兼容:不仅兼容Hive,还可以从RDD、parquet文件、Json文件获取数据、支持从RDBMS获取数据。
 性能优化:采用内存列式存储、自定义序列化器等方式提升性能。
 组件扩展:SQL的语法解析器、分析器、优化器都可以重新定义和扩展。
Spark SQL是Spark提供的针对结构化数据处理的模块。不同于基本的Spark RDD API,SparkSQL提供的接口提供了更多的关于数据和计算执行的信息。其数据源可以是文件、Hive表、其他数据库等,我们可以通过command-line或者JDBC/ODBC与SQL接口进行交互。

5.3 Spark SQL操作MySQL

//启动spark客户端
spark-shell --master spark://master:7077 --driver-memory 1G
//连接mysql数据库
scala>val jdbcDF = spark.read.format("jdbc").options(Map("url" ->"jdbc:mysql://192.168.1.106:3306/testdb", "driver" ->"com.mysql.jdbc.Driver", "dbtable" ->"testdb.stud_info", "user" ->"feigu", "password" ->"feigu")).load()
//创建一个视图
scala>jdbcDF.createOrReplaceTempView("stud_info")
scala> val sqlDF=sql("select * from stud_info limit 5")
sqlDF: org.apache.spark.sql.DataFrame = [stud_code: string, stud_name: string ... 8 more fields]

scala> sqlDF.show()
+----------+---------+--------+------+--------+------------+------------+-----+
| stud_code|stud_name|stud_sex| birthday| log_date|orig_addr|lev_date|college_code|college_name|state|
+----------+---------+--------+----------+---+------------+------------+-----+
|2015101000| 王进| M|1997-08-01|2014-09-01| 苏州| null| 10| 理学院| 1
|2015101001| 刘海| M|1997-09-29|2014-09-01| 上海| null| 10| 理学院| 1
|2015101002| 张飞| M|1996-10-21|2014-09-02| 济南| null| 10| 理学院| 1
|2015101003| 刘婷| F|1998-01-10|2014-09-01| 北京| null| 10| 理学院| 1
|2015101004| 卢家| M|1997-08-01|2014-09-01| 南京| null| 10| 理学院| 1

5.4 Spark SQL操作Hive
Spark SQL与Hive的交换,当在Hive上工作时,必须实例化SparkSession对Hive的支持,包括对持久化Hive元存储的连通性,对Hive序列化反序列化,Hive用户自定义函数的支持。当没有在hive-site.xml配置是,context会自动在当前目录创建metastore_db并且创建一个被spark.sql.warehouse.dir配置的目录,默认在spark应用启动的当前目录的spark-warehouse。注意从Spark2.0.0开始hive-site.xml中的hive.metastore.warehouse.dir参数被弃用。作为替代,使用spark.sql.warehouse.dir来指定仓库中数据库的位置。你可能需要授权写权限给启动spark应用的用户。

spark-shell --master spark://master:7077 --driver-memory 1G --total-executor-cores 2
import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession

case class Record(key: Int, value: String)

// warehouseLocation points to the default location for managed databases and tables
val warehouseLocation = "spark-warehouse"

val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()

import spark.implicits._
import spark.sql

sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
sql("LOAD DATA LOCAL INPATH '/home/hadoop/bigdata/spark/examples/src/main/resources/kv1.txt' INTO TABLE src")

// Queries are expressed in HiveQL
sql("SELECT * FROM src limit 3").show()

// +---+-------+
// |key| value|
// +---+-------+
// |238|val_238|
// | 86| val_86|
// |311|val_311|
// ...

// Aggregation queries are also supported.
sql("SELECT COUNT(*) FROM src").show()
// +--------+
// |count(1)|
// +--------+
// | 500 |
// +--------+

// The results of SQL queries are themselves DataFrames and support all normal functions.
val sqlDF = sql("SELECT key, value FROM src WHERE key < 10 ORDER BY key") // The items in DaraFrames are of type Row, which allows you to access each column by ordinal. val stringsDS = sqlDF.map { case Row(key: Int, value: String) => s"Key: $key, Value: $value"
}
stringsDS.show()
// +--------------------+
// | value|
// +--------------------+
// |Key: 0, Value: val_0|
// |Key: 0, Value: val_0|
// |Key: 0, Value: val_0|
// ...

// You can also use DataFrames to create temporary views within a SparkSession.
val recordsDF = spark.createDataFrame((1 to 100).map(i => Record(i, s"val_$i")))
recordsDF.createOrReplaceTempView("records")

// Queries can then join DataFrame data with data stored in Hive.
sql("SELECT * FROM records r JOIN src s ON r.key = s.key").show()
// +---+------+---+------+
// |key| value|key| value|
// +---+------+---+------+
// | 2| val_2| 2| val_2|
// | 4| val_4| 4| val_4|
// | 5| val_5| 5| val_5|

5.5 pyspark操作hive
以下代码操作hive中表:fund.rpt_fund的数据,fund是数据库名称,rpt_fund是表名。

from pyspark.sql import SparkSession
from pyspark.sql import Row
from pyspark.sql.functions import *

warehouse_location = 'spark-warehouse'

spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", warehouse_location) \
.enableHiveSupport() \
.getOrCreate()

df= spark.sql("Select fund_date,nav,accnav from fund.rpt_fund")
df1=df.select(substring(trim(df.fund_date),1,7).alias('year'),df.nav,df.accnav)
df2=df1.groupBy("year").mean("nav","accnav").orderBy("year")
df3=df2.toPandas()
df4=df3.set_index(['year'])
df4.plot(kind='bar',rot=30)
## df4.plot(kind='line',rot=30)

或折线图

5.6练习
一、单选题
1. Spark 的四大组件下面哪个不是
A.Spark Streaming
B Mlib
C Graphx
D Spark R

2.spark 1.4 版本的最大变化
A spark sql Release 版本
B 引入 Spark R
C DataFrame
D支持动态资源分配

3. Spark Job 默认的调度模式
A FIFO B FAIR
C 无 D 运行时指定

4.下面哪个不是 RDD 的特点
A. 可分区 B 可序列化 C 可修改 D 可持久化

5. 关于广播变量,下面哪个是错误的
A 任何函数调用 B 是只读的 C 存储在各个节点 D 存储在磁盘或 HDFS

6. 关于累加器,下面哪个是错误的
A 支持加法 B 支持数值类型
C 可并行 D 不支持自定义类型

7.Spark 支持的分布式部署方式中哪个是错误的
A standalone B spark on mesos
C spark on YARN D Spark on local

8.Stage 的 Task 的数量由什么决定
A Partition B Job C Stage D TaskScheduler

9.下面哪个操作是窄依赖
A join B filter
C group D sort

10.下面哪个操作肯定是宽依赖
A map B flatMap
C reduceByKey D sample

11.spark 的 master 和 worker 通过什么方式进行通信的?
A http B nio C netty D Akka

12.下列哪个不是 RDD 的缓存方法
A persist() B Cache()
C Memory()

13.Task 运行在下来哪里个选项中 Executor 上的工作单元
A Driver program B. spark master
C.worker node D Cluster manager

14.hive 的元数据存储在 derby 和 MySQL 中有什么区别
A.没区别 B.多会话 C.支持网络环境 D数据库的区别

15.DataFrame 和 RDD 最大的区别
A.科学统计支持 B.多了 schema
C.存储方式不一样 D.外部数据源支持

二、实战题
1、利用Spark SQL查询MySQL数据库中stud_score,stud_info表,统计学生各科总成绩,并选出前5名的同学。

附录;推荐读物或网站
一、Linux
1、网站:
Linux中国:https://linux.cn
鸟哥的Linux私房菜: http://linux.vbird.org
Linux下载站: http://www.linuxdown.net
Linux公社: http://www.linuxidc.com
2、图书:
《鸟哥的Linux基础学习篇》鸟哥著

二、MySQL
1、网站:
MySQL社区:http://www.mysqlpub.com/
MySQL菜鸟教程: http://www.runoob.com/mysql/mysql-tutorial.html
MySQL官网:http://www.mysql.com/
2、图书
《深入浅出MySQL》唐汉名等著
三、Python
1、网站:
http://www.pythondoc.com/
2、图书:
基础入门:《python编程入门》Toby Donaldson著
《python基础教程》Magnus Lie Hetland著
数据分析:《利用Python进行数据分析》
机器学习:《机器学习实战》
《Python数据挖掘入门与实践》
《Python机器学习》【美】sebastian Raschka
四、Hadoop
1、hadoop官网:
http://www.apache.org/
2、图书:
《hadoop权威指南》第三版
《Hadoop大数据处理》刘军著
《自己动手做大数据系统》飞谷团队著
五、Spark
1、Spark官网:
http://www.apache.org/
2、图书
《Spark 核心技术与高级应用》于俊等著
《spark机器学习》【南非】Nick Pentreath 著
六.R
1.网站:
http://ggplot2.tidyverse.org/reference/
2. 图书:
《R语言实战》作者: Robert I. Kabacoff 译者: 高涛 / 肖楠 / 陈钢
《ggplot2数据分析与图形艺术》[美] 哈德利•威克姆 著;统计之都 译

 

第4章 Hadoop入门
4.1 Hadoop大数据处理架构
图4-1 Hadoop大数据处理架构图

从底部开始,Hadoop生态圈由以下内容组成:
• HDFS—— Hadoop生态圈的基本组成部分是Hadoop分布式文件系统(Hadoop Distributed File System-HDFS)。HDFS是一种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。HDFS为HBase等工具提供了数据基础。
• MapReduce——Hadoop的主要执行框架是MapReduce,它是一个分布式、并行处理的编程模型。MapReduce把任务分为map(映射)阶段和reduce(化简)。开发人员使用存储在HDFS中数据(可实现快速存储),编写Hadoop的MapReduce任务。由于MapReduce工作原理的特性, Hadoop能以并行的方式访问数据,从而实现快速访问数据。
• Hbase——HBase是一个建立在HDFS之上,面向列的NoSQL数据库,用于快速读/写大量数据。HBase使用Zookeeper进行管理,确保所有组件都正常运行。
• Zookeeper ——用于Hadoop的分布式协调服务。Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。
• Oozie——Oozie是一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。
• Pig——它是MapReduce编程的复杂性的抽象。Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。其编译器将Pig Latin翻译成MapReduce程序序列。
• Hive ——Hive类似于SQL高级语言,用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。像Pig一样,Hive作为一个抽象层工具,吸引了很多熟悉SQL而不是Java编程的数据分析师。
Hadoop的生态圈还包括以下几个框架,用来与其它企业融合:
• Sqoop是一个连接工具,用于在关系数据库、数据仓库和Hadoop之间转移数据。Sqoop利用数据库技术描述架构,进行数据的导入/导出;利用MapReduce实现并行化运行和容错技术。
• Flume提供了分布式、可靠、高效的服务,用于收集、汇总大数据,并将单台计算机的大量数据转移到HDFS。它基于一个简单而灵活的架构,并提供了数据流的流。它利用简单的可扩展的数据模型,将企业中多台计算机上的数据转移到Hadoop。
4.2 Hadoop的核心HDFS
图4-2 HDFS架构图

Client:
访问或通过命令行管理HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。
NameNode:
Master节点,只有一个,管理HDFS的名称空间和数据块映射信息;配置副本策略;处理客户端请求。
DataNode:
Slave节点,存储实际的数据;执行数据块的读写;汇报存储信息给NameNode。
Secondary NameNode:
辅助NameNode,分担其工作量;定期合并fsimage和fsedits,推送给NameNode;紧急情况下,可辅助恢复NameNode,但Secondary NameNode并非NameNode的热备

4.3 Hadoop的核心MapReduce
MapReduce是hadoop技术的核心,它提供了一种可以利用底层分布式处理环境进行并行出理的模式,并将处理过程分为两个阶段:Map和Reduce。在map阶段,原始数据通过分片处理输入到mapper进行过滤和转换,生成的中间数据在Reduce阶段作为Reducer的输入,经过reducer的聚合处理,得到输出结果。其处理架构如下:
图4-3 MapReduce处理架构图

4.4 HDFS常用命令
在本节将介绍,如何创建或删除HDFS目录、如何把本地文件传输或复制到HDFS上、如何获取HDFS上的文件等。
HDFS的命令格式为:
hadoop fs -cmd
其中cmd为具体命令,为一系列可变参数,请看如下样例:
 查看HDFS上的根目录下的目录或文件:

$ hadoop fs -ls /
drwxr-xr-x - hadoop supergroup 0 2017-02-15 21:29 /ch7
drwxr-xr-x - hadoop supergroup 0 2017-02-25 12:31 /exdata
drwxr-xr-x - hadoop supergroup 0 2017-01-11 21:33 /hbase

 创建目录

$ hadoop fs -mkdir -p /data/tmp
hadoop fs -ls /
drwxr-xr-x - hadoop supergroup 0 2017-02-15 21:29 /ch7
drwxr-xr-x - hadoop supergroup 0 2017-03-26 11:15 /data
hadoop fs -ls /data/tmp

 把linux本地文件上传到HDFS

hadoop fs -put log.txt /data/tmp/
hadoop fs -ls /data/tmp/
-rw-r--r-- 3 hadoop supergroup 34 2017-03-26 11:20 /data/tmp/log.txt

 查看HDFS文件内容

hadoop fs -cat /data/tmp/log.txt
sh: 0: Can't open insert_mysql.sh

 下载HDFS文件

$rm log.txt
$ hadoop fs -get /data/tmp/log.txt

 删除HDFS文件或空目录

$ hadoop fs -rm /data/tmp/log.txt

4.5 Hadoop运行实例
下例为Hadoop2.7.2版本MapReudce示例之WordCount
 查看测试数据

$ cat wordcount.txt
hadoop spark
hadoop hive
hadoop hbase
hadoop pig
spark sql
spark mllib
spark r
spark streaming
spark graphx
scala java
python c
mysql sql

 在HDFS上创建目录

$ hadoop fs -mkdir -p /wordcount/input

 把测试文件上传到HDFS

$hadoop fs -put wordcount.txt /wordcount/input
$ hadoop fs -ls /wordcount/input
-rw-r--r-- 3 hadoop supergroup 138 2017-03-26 15:14 /wordcount/input/wordcount.txt

 运行hadoop一个统计单词频度的程序

hadoop jar /home/hadoop/bigdata/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount/input/wordcount.txt /wordcount/output

 查看运行结果

hadoop fs -cat /wordcount/output/part*

4.6 Hadoop与Hive
Hive是建立在Hadoop之上的数据仓库,由Facebook开发,在某种程度上可以看成是用户编程接口,本身并不存储和处理数据,依赖于HDFS存储数据,依赖MR处理数据。有类SQL语言HiveQL,不完全支持SQL标准,如,不支持更新操作、索引和事务,其子查询和连接操作也存在很多限制。
Hive把HQL语句转换成MR任务后,采用批处理的方式对海量数据进行处理。数据仓库存储的是静态数据,很适合采用MR进行批处理。Hive还提供了一系列对数据进行提取、转换、加载的工具,可以存储、查询和分析存储在HDFS上的数据。
图4-5Hadoop与Hive间的关系:

在4.5节中,我们统计一个文件的字频,使用了一个java现成的包,一般而言,如果需要处理HDFS上文件,需要使用java开发一个相关应用MapReduce来实现;不过有不少任务,我们不一定要使用Java来实现,除了Java,我们还可以使用HQL,尤其对对Java不熟悉的人来说,将带来不少便利,同时,在一定程度上,也大大降处理基于HDFS上文件的门槛,下例是以HQL实现以上需求的一个示例。
###首先在hive中创建1表,然后,把数据导入该表

$ hive
hive> show databases;
OK
default
feigu
sqoop
stg_db
Time taken: 2.72 seconds, Fetched: 4 row(s)
hive> use feigu; ###使用feigu库
###在feigu库中创建表:wordcount
hive>CREATE TABLE wordcount (a1 string ,a2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n' ;
##导入数据
hive> load data local inpath '/home/hadoop/wordcount.txt' overwrite into table wordcount;

创建一个视图,把两个字段值,放在一列,考虑到有重复值,采用union all

hive> create view v_wordcount (b1) as select a1 from wordcount union all select a2 from wordcount ;
###统计字频
hive> select b1,count(*) from v_wordcount group by b1;
Query ID = hadoop_20170329111745_5f3e13ce-3c76-48c2-933e-14c9936827a2
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Starting Job = job_1480603936205_0084, Tracking URL = http://master:8088/proxy/application_1480603936205_0084/
Kill Command = /home/hadoop/bigdata/hadoop/bin/hadoop job -kill job_1480603936205_0084
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2017-03-29 11:18:15,343 Stage-1 map = 0%, reduce = 0%
2017-03-29 11:18:28,879 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.03 sec
2017-03-29 11:18:44,870 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.75 sec
MapReduce Total cumulative CPU time: 4 seconds 750 msec
Ended Job = job_1480603936205_0084
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.75 sec HDFS Read: 8223 HDFS Write: 113 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 750 msec
OK
c 1
graphx 1
hadoop 4
hbase 1
hive 1
java 1
mllib 1
mysql 1
pig 1
python 1
r 1
scala 1
spark 6
sql 2
streaming 1
Time taken: 62.681 seconds, Fetched: 15 row(s)
hive>

4.7练习
一、单选题
1. 下面哪个程序负责HDFS数据存储。
a) NameNode b) Jobtracker
c) Datanode
d) secondaryNameNode e) tasktracker
2. HDfS中的block默认保存几份?
a) 3份 b) 2份 c) 1份 d) 不确定

3. 下列哪个程序通常与NameNode在一个节点启动?
a) SecondaryNameNode b) DataNode c) TaskTracker d) Jobtracker

4. HDFS默认Block Size
a) 32MB b) 64MB c) 128MB

5. 下列哪项通常是集群的最主要的性能瓶颈
a) CPU b) 网络 c) 磁盘 d) 内存
二、创建一个文件,然后把该文件复制到HDFS上,然后查看该文件内容。