3.4 机器学习库
spark是基于内存的存储系统,它本质上能提高节点内和节点之间的数据访问速度。这似乎与ml有一种自然契合,因为许多算法需要对数据进行多次传递或重新分区。mllib是一个开源库,但仍有一些私人公司还在不断按自己的方式来实现mllib中的算法。
在第5章会看到大多数标准机器学习算法可以表示为优化问题。例如,经典线性回归会最小化回归直线与实际y值之间的距离平方和:
其中,是由下面的线性表达式所得到的预测值:
a通常称为斜率,b通常称为截距。线性优化问题更一般化的公式可以写成最小化加法函数:
其中,l(w | xi, yi)称为损失函数,r(w)是正则函数。正则函数增加了模型函数的复杂性,比如参数的数量(或基于此的自然对数)。下表给出了大多数常见的损失函数:
正则化的目的是惩罚更复杂的模型,以避免过拟合和降低泛化错误。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章会讨论其具体的实现。