天天看点

《Scala机器学习》一一3.4 机器学习库

3.4 机器学习库

spark是基于内存的存储系统,它本质上能提高节点内和节点之间的数据访问速度。这似乎与ml有一种自然契合,因为许多算法需要对数据进行多次传递或重新分区。mllib是一个开源库,但仍有一些私人公司还在不断按自己的方式来实现mllib中的算法。

在第5章会看到大多数标准机器学习算法可以表示为优化问题。例如,经典线性回归会最小化回归直线与实际y值之间的距离平方和:

《Scala机器学习》一一3.4 机器学习库

其中,是由下面的线性表达式所得到的预测值:

《Scala机器学习》一一3.4 机器学习库

a通常称为斜率,b通常称为截距。线性优化问题更一般化的公式可以写成最小化加法函数:

《Scala机器学习》一一3.4 机器学习库

其中,l(w | xi, yi)称为损失函数,r(w)是正则函数。正则函数增加了模型函数的复杂性,比如参数的数量(或基于此的自然对数)。下表给出了大多数常见的损失函数:

《Scala机器学习》一一3.4 机器学习库

正则化的目的是惩罚更复杂的模型,以避免过拟合和降低泛化错误。mllib当前支持如下的正则化:

《Scala机器学习》一一3.4 机器学习库

其中,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章会讨论其具体的实现。

继续阅读