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-meansGaussian混合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 SparkRR是用流行的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章会讨论其具体的实现。
相关资源:七夕情人节表白HTML源码(两款)