Spark作为新兴的、应用范围为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相关内容的学习与开发,其中MLlib是Spark框架使用的核心。本书是一本细致介绍Spark MLlib程序设计的图书,入门简单,示例丰富。 本书分为13章,从Spark基础安装和配置开始,依次介绍MLlib程序设计基础、MLlib的数据对象构建、MLlib中RDD使用介绍,各种分类、聚类、回归等数据处理方法,后还通过一个完整的实例,回顾了前面的学习内容,并通过代码实现了一个完整的分析过程。 本书理论内容由浅而深,采取实例和理论相结合的方式,讲解细致直观,适合Spark MLlib初学者、大数据分析和挖掘人员,也适合高校和培训学习相关专业的师生教学参考。
MLlib是Apache Spark机器学习库。本书入门简单,实例丰富,详解协同过滤、线性回归、分类、决策树、保序回归、聚类、关联、数据降维、特征提取和转换等MLlib主要算法,用实例说明MLlib大数据机器学习算法的运用。
王晓华,高校博学计算机专业讲师,主要研究方向为云计算、数据挖掘;曾主持和参与多项国家和省级科研课题,发表过多篇论文,有一项专利。
目 录
第1章 星星之火 1
1.1 大数据时代 1
1.2 大数据分析时代 2
1.3 简单、优雅、有效——这就是Spark 3
1.4 核心——MLlib 4
1.5 星星之火,可以燎原 6
1.6 小结 6
第2章 Spark安装和开发环境配置 7
2.1 Windows单机模式Spark安装和配置 7
2.1.1 Windows 7安装Java 7
2.1.2 Windows 7安装Scala 10
2.1.3 Intellij IDEA下载和安装 13
2.1.4 Intellij IDEA中Scala插件的安装 14
2.1.5 HelloJava——使用Intellij IDEA创建Java程序 18
2.1.6 HelloScala——使用Intellij IDEA创建Scala程序 21
2.1.7 一脚——Spark单机版安装 26
2.2 经典的WordCount 29
2.2.1 Spark实现WordCount 29
2.2.2 MapReduce实现WordCount 31
2.3 小结 34
第3章 RDD详解 35
3.1 RDD是什么 35
3.1.1 RDD名称的秘密 35
3.1.2 RDD特性 36
3.1.3 与其他分布式共享内存的区别 37
3.1.4 RDD缺陷 37
3.2 RDD工作原理 38
3.2.1 RDD工作原理图 38
3.2.2 RDD的相互依赖 38
3.3 RDD应用API详解 39
3.3.1 使用aggregate方法对给定的数据集进行方法设定 39
3.3.2 提前计算的cache方法 42
3.3.3 笛卡尔操作的cartesian方法 43
3.3.4 分片存储的coalesce方法 44
3.3.5 以value计算的countByValue方法 45
3.3.6 以key计算的countByKey方法 45
3.3.7 除去数据集中重复项的distinct方法 46
3.3.8 过滤数据的filter方法 47
3.3.9 以行为单位操作数据的flatMap方法 47
3.3.10 以单个数据为目标进行操作的map方法 48
3.3.11 分组数据的groupBy方法 48
3.3.12 生成键值对的keyBy方法 49
3.3.13 同时对两个数据进行处理的reduce方法 50
3.3.14 对数据进行重新排序的sortBy方法 51
3.3.15 合并压缩的zip方法 52
3.4 小结 53
第4章 MLlib基本概念 54
4.1 MLlib基本数据类型 54
4.1.1 多种数据类型 54
4.1.2 从本地向量集起步 55
4.1.3 向量标签的使用 56
4.1.4 本地矩阵的使用 58
4.1.5 分布式矩阵的使用 59
4.2 MLlib数理统计基本概念 62
4.2.1 基本统计量 62
4.2.2 统计量基本数据 63
4.2.3 距离计算 64
4.2.4 两组数据相关系数计算 65
4.2.5 分层抽样 67
4.2.6 假设检验 69
4.2.7 随机数 70
4.3 小结 71
第5章 协同过滤算法 72
5.1 协同过滤 72
5.1.1 协同过滤概述 72
5.1.2 基于用户的推荐 73
5.1.3 基于物品的推荐 74
5.1.4 协同过滤算法的不足 75
5.2 相似度度量 75
5.2.1 基于欧几里得距离的相似度计算 75
5.2.2 基于余弦角度的相似度计算 76
5.2.3 欧几里得相似度与余弦相似度的比较 77
5.2.4 及时个例子——余弦相似度实战 77
5.3 MLlib中的交替最小二乘法(ALS算法) 80
5.3.1 最小二乘法(LS算法)详解 81
5.3.2 MLlib中交替最小二乘法(ALS算法)详解 82
5.3.3 ALS算法实战 83
5.4 小结 85
第6章 MLlib线性回归理论与实战 86
6.1 随机梯度下降算法详解 86
6.1.1 道士下山的故事 87
6.1.2 随机梯度下降算法的理论基础 88
6.1.3 随机梯度下降算法实战 88
6.2 MLlib回归的过拟合 89
6.2.1 过拟合产生的原因 90
6.2.2 lasso回归与岭回归 91
6.3 MLlib线性回归实战 91
6.3.1 MLlib线性回归基本准备 91
6.3.2 MLlib线性回归实战:商品价格与消费者收入之间的关系 94
6.3.3 对拟合曲线的验证 95
6.4 小结 97
第7章 MLlib分类实战 98
7.1 逻辑回归详解 98
7.1.1 逻辑回归不是回归算法 98
7.1.2 逻辑回归的数学基础 99
7.1.3 一元逻辑回归示例 100
7.1.4 多元逻辑回归示例 101
7.1.5 MLlib逻辑回归验证 103
7.1.6 MLlib逻辑回归实例:肾癌的转移判断 104
7.2 支持向量机详解 106
7.2.1 三角还是圆 106
7.2.2 支持向量机的数学基础 108
7.2.3 支持向量机使用示例 109
7.2.4 使用支持向量机分析肾癌转移 110
7.3 朴素贝叶斯详解 111
7.3.1 穿裤子的男生or女生 111
7.3.2 贝叶斯定理的数学基础和意义 112
7.3.3 朴素贝叶斯定理 113
7.3.4 MLlib朴素贝叶斯使用示例 114
7.3.5 MLlib朴素贝叶斯实战:“僵尸粉”的鉴定 115
7.4 小结 117
第8章 决策树与保序回归 118
8.1 决策树详解 118
8.1.1 水晶球的秘密 119
8.1.2 决策树的算法基础:信息熵 119
8.1.3 决策树的算法基础——ID3算法 121
8.1.4 MLlib中决策树的构建 122
8.1.5 MLlib中决策树示例 123
8.1.6 随机雨林与梯度提升算法(GBT) 125
8.2 保序回归详解 127
8.2.1 何为保序回归 128
8.2.2 保序回归示例 128
8.3 小结 129
第9章 MLlib中聚类详解 130
9.1 聚类与分类 130
9.1.1 什么是分类 130
9.1.2 什么是聚类 131
9.2 MLlib中的Kmeans算法 131
9.2.1 什么是kmeans算法 131
9.2.2 MLlib中Kmeans算法示例 133
9.2.3 Kmeans算法中细节的讨论 134
9.3 高斯混合聚类 135
9.3.1 从高斯分布聚类起步 135
9.3.2 混合高斯聚类 137
9.3.3 MLlib高斯混合模型使用示例 137
9.4 快速迭代聚类 138
9.4.1 快速迭代聚类理论基础 138
9.4.2 快速迭代聚类示例 139
9.5 小结 140
第10章 MLlib中关联规则 141
10.1 Apriori频繁项集算法 141
10.1.1 啤酒与尿布 141
10.1.2 经典的Apriori算法 142
10.1.3 Apriori算法示例 144
10.2 FP-growth算法 145
10.2.1 Apriori算法的局限性 145
10.2.2 FP-growth算法 145
10.2.3 FP树示例 148
10.3 小结 149
第11章 数据降维 150
11.1 奇异值分解(SVD) 150
11.1.1 行矩阵(RowMatrix)详解 150
11.1.2 奇异值分解算法基础 151
11.1.3 MLlib中奇异值分解示例 152
11.2 主成分分析(PCA) 153
11.2.1 主成分分析(PCA)的定义 154
11.2.2 主成分分析(PCA)的数学基础 154
11.2.3 MLlib中主成分分析(PCA)示例 155
11.3 小结 156
第12章 特征提取和转换 157
12.1 TF-IDF 157
12.1.1 如何查找所要的新闻 157
12.1.2 TF-IDF算法的数学计算 158
12.1.3 MLlib中TF-IDF示例 159
12.2 词向量化工具 160
12.2.1 词向量化基础 160
12.2.2 词向量化使用示例 161
12.3 基于卡方检验的特征选择 162
12.3.1 “吃货”的苦恼 162
12.3.2 MLlib中基于卡方检验的特征选择示例 163
12.4 小结 164
第13章 MLlib实战演练——鸢尾花分析 166
13.1 建模说明 166
13.1.1 数据的描述与分析目标 166
13.1.2 建模说明 168
13.2 数据预处理和分析 171
13.2.1 微观分析——均值与方差的对比分析 171
13.2.2 宏观分析——不同种类特性的长度计算 174
13.2.3 去除重复项——相关系数的确定 176
13.3 长与宽之间的关系——数据集的回归分析 180
13.3.1 使用线性回归分析长与宽之间的关系 180
13.3.2 使用逻辑回归分析长与宽之间的关系 183
13.4 使用分类和聚类对鸢尾花数据集进行处理 184
13.4.1 使用聚类分析对数据集进行聚类处理 184
13.4.2 使用分类分析对数据集进行分类处理 187
13.5 最终的判定——决策树测试 188
13.5.1 决定数据集的归类——决策树 188
13.5.2 决定数据集归类的分布式方法——随机雨林 190
13.6 小结 191
回归分析(regression analysis)是一种用来确定两种或两种以上变量间相互依赖的定量关系的统计分析方法,运用十分广泛。回归分析可以按以下要素分类:? 按照涉及的自变量的多少,分为回归和多重回归分析;? 按照自变量的多少,可分为一元回归分析和多元回归分析;? 按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多重线性回归分析。回归分析是最常用的机器学习算法之一,可以说回归分析理论与实际研究的建立使得机器学习作为一门系统的计算机应用学科得以确认。MLlib中,线性回归是一种能够较为预测具体数据的回归方法,它通过给定的一系列训练数据,在预测算法的帮助下预测未知的数据。本章将向读者介绍线性回归的基本理论与MLlib中使用的预测算法,以及为了防止过度拟合而进行的正则化处理,这些不仅仅是回归算法的核心,也是MLlib的最核心部分。本章主要知识点:? 随机梯度下降算法详解? MLlib回归的过拟合? MLlib线性回归实战6.1 随机梯度下降算法详解机器学习中回归算法的种类有很多,例如神经网络回归算法、蚁群回归算法、支持向量机回归算法等,这些都可以在一定程度上达成回归拟合的目的。MLlib中使用的是较为经典的随机梯度下降算法,它充分利用了Spark框架的迭代计算特性,通过不停地判断和选择当前目标下的路径,从而能够在最短路径下达到的结果,继而提高大数据的计算效率。6.1.1 道士下山的故事在介绍随机梯度下降算法之前,给大家讲一个道士下山的故事。请读者看图6-1。 图6-1 模拟随机梯度下降算法的演示图这是一个模拟随机梯度下降算法的演示图。为了便于理解,笔者将其比喻成道士想要出去游玩的一座山。设想道士有24小时和道友一起到一座不太熟悉的山上去玩,在兴趣盎然中很快登上了山顶。但是天有不测,下起了雨。如果这时需要道士和其同来的道友以最快的速度下山,那该怎么办呢?如果想以最快的速度下山,那么最快的办法就是顺着坡度最陡峭的地方走下去。但是由于不熟悉路,道士在下山的过程中,每走过一段路程需要停下来观望,从而选择最陡峭的下山路线。这样一路走下来的话,可以在最短时间内走到山脚。这个最短的路线从图上可以近似的表示为:① → ② → ③ → ④ → ⑤ → ⑥ → ⑦每个数字代表每次停顿的地点,这样只需要在每个停顿的地点上选择最陡峭的下山路即可。这个就是一个道士下山的故事。随机梯度下降算法和这个类似,如果想要使用最迅捷的方法,那么最简单的办法就是在下降一个梯度的阶层后,寻找一个当前获得的较大坡度继续下降。这就是随机梯度算法的原理。6.1.2 随机梯度下降算法的理论基础从上一小节的例子可以看到,随机梯度下降算法就是不停地寻找某个节点中下降幅度较大的那个趋势进行迭代计算,直到将数据收缩到符合要求的范围为止。它可以用数学公式表达如下: 在上一章介绍最小二乘法的时候,笔者通过最小二乘法说明了直接求解化变量的方法,也介绍了在求解过程中的前提条件是要求计算值与实际值的偏差的平方最小。但是在随机梯度下降算法中,对于系数需要通过不停地求解出当前位置下化的数据。这句话通过数学方式表达的话就是不停地对系数θ求偏导数。即公式如下: 公式中θ会向着梯度下降的最快方向减少,从而推断出θ的解。因此可以说随机梯度下降算法最终被归结为通过迭代计算特征值从而求出最合适的值。θ求解的公式如下: 公式中α是下降系数,用较为通俗的话来说就是用以计算每次下降的幅度大小。系数越大则每次计算中差值越大,系数越小则差值越小,但是计算时间也相对延长。6.1.3 随机梯度下降算法实战随机梯度下降算法将梯度下降算法通过一个模型来表示的话,如图6-2所示: 图6-2 随机梯度下降算法过程从图中可以看到,实现随机梯度下降算法的关键是拟合算法的实现。而本例的拟合算法实现较为简单,通过不停地修正数据值从而达到数据的值。具体实现代码如程序6-1所示:代码位置://SRC//C06// SGD.scala程序6-1 随机梯度下降算法import scala.collection.mutable.HashMap
object SGD { val data = HashMap[Int,Int]() //创建数据集 def getData():HashMap[Int,Int] = { //生成数据集内容 for(i (12i)) //写入公式y=2x } data //返回数据集 }
var θ:Double = 0 //及时步假设θ为0 var α:Double = 0.1 //设置步进系数
def sgd(x:Double,y:Double) = { //设置迭代公式 θ = θ - α ( (θx) - y) //迭代公式 } def main(args: Array[String]) { val dataSource = getData() //获取数据集 dataSource.foreach(myMap =>{ //开始迭代 sgd(myMap._1,myMap._2) //输入数据 }) println(“最终结果θ值为 ” θ) //显示结果 }}最终结果请读者自行验证完成。读者在重复运行本程序的时候,可以适当地增大数据量和步进系数。当增大数据量的时候可以看到,θ值会开始偏离一定的距离,请读者考虑为何会这样。6.2 MLlib回归的过拟合有计算就有误差,误差不可怕,我们需要的是采用何种方法消除误差。回归分析在计算过程中,由于特定分析数据和算法选择的原因,结果会对分析数据产生非常强烈的拟合效果;而对于测试数据,却表现得不理想,这种效果和原因称为过拟合。本节将分析过拟合产生的原因和效果,并给出一个处理手段供读者学习和掌握。6.2.1 过拟合产生的原因在上一节的,我们建议和鼓励读者对数据的量进行调整从而获得更多的拟合修正系数。相信读者也发现,随着数据量的增加,拟合的系数在达到一定值后会发生较大幅度的偏转。在上一节程序6-1的例子中,步进系数在0.1的程度下,数据量达到70以后就发生偏转。产生这样原因就是MLlib回归会产生过拟合现象。对于过拟合的例子请读者参看图6-3。 图6-3 拟合与过拟合从图6-3所示A图和B图的对比来看,如果测试数据过于侧重某些具体的点,则会对整体的曲线形成构成很大的影响,从而影响到待测数据的测试精准度。这种对于测试数据过于接近而实际数据拟合程度不够的现象称为过拟合,而解决办法就是对数据进行处理,而处理过程称为回归的正则化。正则化使用较多的一般有两种方法,lasso回归(L1回归)和岭回归(L2回归)。其目的是通过对最小二乘估计加入处罚约束,使某些系数的估计为0。从6-3图中A图和B图回归曲线上看,A和B的差异较多地集中在回归系数的选取上。这里可以近似地将A假设为如下公式: 而B公式可以近似的表示为: 从A和B公式的比较来看,B公式更多的是增加了系数。因此解决办法就是通过对增加的系数进行消除从而使之消除过拟合。更加直观的理解就是,防止通过拟合算法计算出的回归公式比较大地响应和依赖某些特定的特征值,从而影响回归曲线的率。6.2.2 lasso回归与岭回归由前面对过拟合产生的原因分析来看,如果能够消除拟合公式中多余的拟合系数,那么产生的曲线可以较好地对数据进行拟合处理。因此可以认为对拟合公式过拟合的消除最直接的办法就是去除其多余的公式,那么通过数学公式表达如下: 从公式可以看到,f(B')是f(B)的变形形式,其通过增加一个新的系数公式J(θ)从而使原始数据公式获得了正则化表达。这里J(θ)又称为损失函数,它通过回归拟合曲线的范数L1和L2与一个步进数α相乘得到。范数L1和范数L2是两种不同的系数惩罚项,首先来看L1范数。L1范数指的是回归公式中各个元素的值之和,其又称为“稀疏规则算子(Lasso regularization)”。其一般公式如下: 即可以通过这个公式计算使得f(B')能够取得最小化。而L2范数指的是回归公式中各个元素的平方和,其又称为“岭回归(Ridge Regression)”可以用公式表示为: MLlib中SGD算法支持L1和L2正则化方法,而LBFGS只支持L2正则化,不支持L1正则化。L1范数和L2范数相比较而言,L1能够在步进系数α在一定值的情况下将回归曲线的某些特定系数修正为0。而L1回归由于其平方的处理方法从而使得回归曲线获得较高的计算精度。6.3 MLlib线性回归实战6.3.1 MLlib线性回归基本准备在前面的章节中,我们为读者介绍了线性回归的一些基本知识,这些知识将伴随读者的整个机器学习和数据挖掘的工作生涯。本节将带领读者开始学习及时个回归算法,即线性回归。首先需要完成线性回归的数据准备工作。MLlib中,线性回归的基本数据是严格按照数据格式进行设置。例如,如果想求得公式y=2x1 3x2系数,那么需要在数据基础中设置2个x值,并且在其前部设置y值。数据整理规则如下:数据位置://DATA//D06//lpsa.data1,0 12,0 23,0 35,1 47,6 19,4 56,3 3这里逗号(,)前面的数值是根据不同的数据求出的结果值,而每个系数的x值依次地被排列在其后。这些就是数据的收集规则:Y = a bX其次是对既定的MLlib回归算法中数据格式的要求,我们可以从回归算法的源码来分析,源码代码段如下:def train( input: RDD[LabeledPoint], numIterations: Int, stepSize: Double): LinearRegressionModel = { train(input, numIterations, stepSize, 1.0)}从上面代码段可以看到,整理的训练数据集需要输入一个LabeledPoint格式的数据,因此在读取来自数据集中的数据时,需要将其转化为既定的格式。本例子数据转化的格式如下:val parsedData = data.map { line => val parts = line.split(',') LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))}.cache()从中可以看到,程序首先对读取的数据集进行分片处理,根据逗号将其分解为因变量与自变量,即线性回归中的y和x值。其后将其转换为LabeledPoint格式的数据,这里part(0)和part(1)分别代表数据分开的y和x值,并根据需要将x值转化成一个向量数组。其次是训练模型的数据要求。numIterations是整体模型的迭代次数,理论上迭代的次数越多则模型的拟合程度越高,但是随之而来的是迭代需要的时间越长。而stepSize是上面章节中随机梯度下降算法中的步进系数,代表每次迭代过程中模型的整体修正程度。一部分就是根据数据集训练的线性回归模型预测数据。MLlib中线性回归模型预测方法有2种,其代码如下:def predict(testData: RDD[Vector]): RDD[Double] = {
def predict(testData: Vector): Double = {表示分别要求输入一个向量或者一个RDD化后的向量作为数据变量,这里可以通过RDD内建的方法对数据进行处理。一个完整的线性回归程序如程序6-2所示。代码位置://SRC//C06// LinearRegression.scala程序6-2 线性回归程序import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}
object LinearRegression { val conf = new SparkConf() //创建环境变量 .setMaster("local") //设置本地化处理 .setAppName("LinearRegression ") //设定名称 val sc = new SparkContext(conf) //创建环境变量实例
def main(args: Array[String]) { val data = sc.textFile("c:/lpsa.data") //获取数据集路径 val parsedData = data.map { line => //开始对数据集处理 val parts = line.split(',') //根据逗号进行分区 LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble))) }.cache() //转化数据格式 //建立模型 val model = LinearRegressionWithSGD.train(parsedData, 100,0.1) val prediction= model.predict(parsedData.map((_.features))) //检验测试集数据 prediction.foreach(obj => println(obj)) //打印原测试集数据使用模型后得出的结果 println(model.predict(Vectors.dense(0,1))) //提供新的待测数据 }
}这里顺带提示一下,读者在一步看到的Vectors.dense(0,1)代码是人为的创建一个MLLib数据向量输入到已构成的数据模型中。请读者自行输入数据和计算回归结果。6.3.2 MLlib线性回归实战:商品价格与消费者收入之间的关系本小节我们做一个MLlib线性回归的实例。某种商品的需求量(y,吨)、价格(x1,元/千克)和消费者收入(x2,元)观测值如表6-1所示。表6-1 消费和需求对应表yx1x2yx1x2
100 5 1000 65 7 40075 7 600 90 5 130080 6 1200 100 4 110070 6 500 110 3 130050 8 30 60 9 300要求:建立需求函数: ;从要求可以看到,我们需要建立一个需求回归公式,首先需要对数据进行处理,而数据的处理可以如图6-4所示。数据位置://DATA//D06//lr.txt 图6-4 数据示例从图6-4可以看到,“|”分割了y值与x值,而不同的x之间通过“,”进行分割。具体程序如程序6-3所示。代码位置://SRC//C06// LinearRegression2.scala程序6-3 线性回归实战import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}
object LinearRegression { val conf = new SparkConf() //创建环境变量 .setMaster("local") //设置本地化处理 .setAppName("LinearRegression2 ") //设定名称 val sc = new SparkContext(conf) //创建环境变量实例
def main(args: Array[String]) { val data = sc.textFile("c:/lr.txt") //获取数据集路径 val parsedData = data.map { line => //开始对数据集处理 val parts = line.split('|') //根据逗号进行分区 LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(',').map(_.toDouble))) }.cache() //转化数据格式 //建立模型 val model = LinearRegressionWithSGD.train(parsedData, 200,0.1) val prediction = model.predict(parsedData.map((_.features)))//检验测试集数据prediction.foreach(obj => println(obj)) //打印原测试集数据使用模型后得出的结果 println(model.predict(Vectors.dense(0,1))) //提供新的待测数据 }
}结果请读者自行验证完成。6.3.3 对拟合曲线的验证上一节中,笔者通过数据拟合出了每个元素对应系数,根据系数的确定可以定义出回归曲线公式。而至于根据系数拟合出的公式是否符合真实的数据表现则需要另外一个检验标准。均方误差(Mean Squared Error,MSE)是衡量“平均误差”的一种较方便的方法,可以评价数据的变化程度。均方根误差是均方误差的算术平方根。标准误差定义为各测量值误差的平方和的平均值的平方根。设n个测量值的误差为θ1、θ2……θn,则这组测量值的标准误差σ计算公式如下: 数理统计中均方误差是指参数估计值与参数真值之差平方的期望值,记为MSE。MSE是衡量“平均误差”的一种较方便的方法,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的度。与此相对应的,还有均方根误差RMSE、平均百分误差等。因此,为了衡量数据预测结果与真实结果之间的差异,可以使用MSE来计算相关的预测误差。代码如下:val valuesAndPreds = parsedData.map { point => { val prediction = model.predict(point.features) (point.label, prediction) }}
val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2)}.mean()我们可以将这些代码添加到已有的程序代码中计算回归曲线的MSE,具体程序如程序6-4所示。代码位置://SRC//C06// LinearRegression3.scala程序6-4 计算回归曲线的MSEimport org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint,
书的内容讲得不错
好书,质量很高
包装有破损
第一版就卖的不错,,, 好书