《基于Spark的机器学习平台设计与实现》学习笔记

通过知网可以下载这篇文章。是厦门大学唐振坤的硕士学位论文。

背景

本文讲述了基于“统计查询模型”和MapReduce,提出了能适用于海量数据的机器学习算法。随后有人开发出了Mahout机器学习算法库。但是由于Spark的内存计算和Spark Streaming对流数据的处理,MapReduce并不是那么完美。

本文提出一个基于Spark的机器学习平台,实现了常见的数据挖掘与机器学习的基本算法。

机器学习平台总体架构

Lambda架构

分为三个层次:批量处理层、服务层、速度层。

在批量处理层,一般选用Hadoop或Spark,完成批量处理计算任务。服务层,可以利用Spark SQL完成实时查询计算任务。速度层采用Spark Streaming,作为批量处理高延迟响应的补充。

一个新数据的到来,需要同时发送至批量处理层和速度层,服务层会通过建立的索引完成低延迟的数据查询,在速度层通过实时查询直接返回结果,最终将两者的查询合并返回最终的输出结果。

机器学习算法设计与实现

面向对象封装

采用工厂方法设计顶层接口,定义各个基本方法,实现机器学习算法的封装。

采用策略模式,允许使用不同的策略求解。即不同的优化算法,梯度下降、牛顿法等。

这样的封装,增大了程序复用、增强了平台扩展能力。

并行-回归

线性回归模型使用最小二乘法拟合。基于Spark平台的线性回归模型,样本通过RDD分块后,在集群多个结点上计算损失函数和部分梯度。由于各个特征上的梯度元素是独立关系,并且梯度可以累加。因此可以并行化。算法如下:

1. 读取数据集,切分数据
2. 迭代运行以下步骤
3.   对每个分片采样,计算损失值和梯度
4.   在每个分片更新目标向量
5.   汇总更新的目标向量和损失值,得到平均的目标向量
6.   检查是否收敛
7. 读取测试集,评估结果

并行-SVM

(这里不是很理解,是每一个小数据集生成一个SVM模型吗,提高了速度,但是数据量少了,精度也可能下降)算法伪代码:

1. 读入数据,切分数据到n台节点
2. 迭代运行以下步骤
3.   生成采用数据集
4.   在采样数据集上评估当前模型,得到错分样本
5.   利用公式,更新权重
6.   更新权重投影至限定空间
7.   检查权重差值,收敛退出
8. 读取测试集,评估结果

并行-KMeans

这个易于并行化,通过map()完成分配,将每个点分配给最近的中心,通过reduce()更新均值中心。

推荐矩阵分解

协同过滤算法不需要依赖对项目内容或结构的深度理解,通过用户历史行为就可以推荐。但是如果历史数据过少,存在冷启动问题。
基于内容推荐,与协同过滤相反。
混合推荐就是混合协同过滤和基于内容的推荐。将两个方法统一到一个模型。可以产生更加精确的推荐,也能克服协同过滤所面临的冷启动及数据稀疏性问题。

在基于协同过滤的推荐方法中,要采用矩阵分解的方式来实现。矩阵分解通过分解评分后形成的因子向量来描述用户和项目的属性。

学习感悟

本文将Hadoop和Spark作为对比,证明Spark在机器学习算法上性能优于Hadoop。

本文对线性回归、支持向量机、KMeans聚类、矩阵分解、PangeRank等进行设计和实现。

个人理解,本文是对Spark MLlib原有的一些机器学习算法(包括没有的,本文自己实现)进行封装,采用工厂、策略等模式。使得用户可以更将轻松、更多选择来使用机器学习算法。基于Lambda架构,从三个层次出发搭建平台。

你可能感兴趣的:(《基于Spark的机器学习平台设计与实现》学习笔记)