本节书摘来自华章计算机《Scala机器学习》一书中的第3章,第3.4节,作者:[美] 亚历克斯·科兹洛夫(Alex Kozlov),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.4 机器学习库
Spark是基于内存的存储系统,它本质上能提高节点内和节点之间的数据访问速度。这似乎与ML有一种自然契合,因为许多算法需要对数据进行多次传递或重新分区。MLlib是一个开源库,但仍有一些私人公司还在不断按自己的方式来实现MLlib中的算法。
在第5章会看到大多数标准机器学习算法可以表示为优化问题。例如,经典线性回归会最小化回归直线与实际y值之间的距离平方和:
其中,是由下面的线性表达式所得到的预测值:
A通常称为斜率,B通常称为截距。线性优化问题更一般化的公式可以写成最小化加法函数:
其中,L(w | xi, yi)称为损失函数,R(w)是正则函数。正则函数增加了模型函数的复杂性,比如参数的数量(或基于此的自然对数)。下表给出了大多数常见的损失函数:
![image](https://yqfile.alicdn.com/e39fdf5c557f1c69634afa363d66905697d198aa.png)
正则化的目的是惩罚更复杂的模型,以避免过拟合和降低泛化错误。MLlib当前支持如下的正则化:
其中,sign (w)是w中所有元素对应的符号向量。
当前MLlib实现了如下的算法:
基本统计
概要统计(summary statistics)
相关性
分层抽样(stratified sampling)
假设检验
流式显著性检验
随机数据生成
分类与回归
线性模型(SVM、logistic回归和线性回归)
朴素贝叶斯
决策树
集成树(随机森林和梯度提升树)
保序回归
协同过滤
交替最小二乘(alternating least squares,ALS)
聚类
k-means
Gaussian混合
Power迭代聚类(PIC)
隐狄利克雷分布(Latent Dirichlet allocation,LDA)
二分(Bisecting)k-means
流式(Streaming)k-means
降维
奇异值分解(SVD)
主成分分析(PCA)
特征提取与变换
频繁模式挖掘
FP-growth
关联规则
PrefixSpan
优化
随机梯度下降(SGD)
有限内存BFGS(L-BFGS)
第5章将会介绍其中的一些算法,而更复杂的非结构化机器学习方法将在第6章介绍。
3.4.1 SparkR
R是用流行的S编程语言实现的(S语言是当时在贝尔实验室工作的John Chambers所创建的),它目前由R统计计算基金会支持。调查表明R的人气近年来在不断增加。SparkR提供了一个轻量级前端来使用基于R的Apache Spark。从Spark 1.6.0开始,SparkR提供了一个分布式DataFrame,它支持选择、过滤、聚合等操作,这与R的DataFrame和dplyr类似,但是SparkR处理的是非常大的数据集。SparkR还支持基于MLlib的分布式机器学习。
SparkR需要R的3.0版本或更高版本,可通过./bin/sparkR来运行shell。本书将在第8章介绍SparkR。
3.4.2 图算法:Graphx和GraphFrames
图算法是其中最难的算法之一,因为若图本身不能被分割(即它能表示成一组断开的子图),那么图算法需要在节点之间有恰当的分布。对节点规模高大数百万的社交网络上进行分析开始流行的原因是,一些公司(如Facebook、谷歌和LinkedIn)的研究人员已经提出了新的方法来规范图表示、算法以及问答类型。
GraphX是一个图计算的现代框架,在2013年的一篇论文提出了这种框架(GraphX: A Resilient Distributed Graph System on Spark by Reynold Xin, Joseph Gonzalez, Michael Franklin和Ion Stoica, GRADES(SIGMOD workshop), 2013)。之前的图并行框架有Pregel和PowerGraph。GraphX中的图由两个RDD表示:一个用于表示顶点;另一个用于表示边。一旦RDD加入,GraphX支持类似于Pregel的API或类似于MapReduce的API,其中map函数应用于节点的近邻,而reduce是在map结果之上进行聚合。
在写本书时,GraphX实现了如下的图算法:
PageRank
连通分量
三角计数
标签传播(label propagation)
SVD ++(协同过滤)
强连通分量
由于GraphX是一个开源库,因此其修改会被列出来。GraphFrames是Databricks公司给出的一种新的实现,它构建在DataFrame之上,完全支持如下这三种语言:Scala、Java和Python。第7章会讨论其具体的实现。