• 《基于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架构,从三个层次出发搭建平台。

  • 相关阅读:
    清除浮动的原理剖析
    修正IE6不支持position:fixed的bug(转)
    Callbacks vs Events
    垂直属性
    jQuery的事件模型
    Dean-Edward的事件系统实现
    简单的导航栏实现
    弹窗层效果的实现(非jQuery实现)
    rmdir
    mkdir
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/13139740.html
Copyright © 2020-2023  润新知