阅读更多
上次ITEYE大规模的信息被盗之后所有的文章都被清除了,很久都没有写相关的文章来记录自己的学习轨迹,最近开始学大数据+机器学习相关的内容,主要是需要一个推荐系统,主要分为离线任务(根据用户行为对主题关键字的权重进行计算训练相关的LDA模型和词袋,可以通过spark MLLib的ALS协同过滤算法训练相关的模型然后更新每个用户的主题关键字权重模型)这部分主要是一个离线的定时任务,还有在线的任务根据用户的点击流实时生成推荐列表,离线的部分找到了一个开源的代码
https://github.com/wingerli/RecSystem
其中关于LDA训练(余弦相似算法TF-IDF)和词袋的训练以及更新用户的感兴趣的主题关键字,这部分的权重都是根据用户行为产生(阅读,转发,评论,收藏)协同过滤的算法ALS和movie lens
http://www.cnblogs.com/zlslch/p/6786159.html 的相似打分都是根据用户行为打分,然后根据打分记录对相关的新闻生成推荐的模型和记录.当然这部分的计算都是离线的,并不能根据点击流实时计算出用户的推荐列表,基于流式计算的实时推荐架构目前比较主流的是lambada架构,主要特性和原理找了一片文章:https://blog.csdn.net/brucesea/article/details/45937875
于是就找到了关于推荐的实时计算架构:Oryx2:http://oryx.io/
关于oryx2的介绍目前还比较少,官方文档也有限目前找到一篇比较好的介绍:http://pangz.me/2015/12/21/Oryx2-Overview/,以及关于源码学习的例子:
https://blog.csdn.net/CodingCatX/article/details/51202212
说说自己的看法,首先关于数据层data layer这部分是基于spark steaming+kafka,之前对于用户推送阅读率的指标计算有用到这部分的内容,实时计算指标有一个难点,就是对于实时的用户点击流进行相关计算的时候,应该都是增量计算,二spark streaming对于增量计算只提供了滑动窗口和updateBystate的递归方式,而指标数据可能来源于不同的数据集,通过这种方式没有办法满足,所以只能将用户的指标存储在redis内,然后进行计算,在数据量不大的情况下可以满足实时相应效率,但是这里面就诞生了一个新的问题,就是关于redis缓存的管理,对于不活跃用户的缓存进行清除,这样可以节省缓存的开支,目前主流的是LRU算法,通过队列链表队列对缓存进行排序,然后清除尾部的数据清除,具体的代码实现网上有很多,实现起来并不困难.
关于离线的任务管理,目前所有的离线任务主要是根据用户行为数据以及文章内容训练LDA模型和词袋这部分的内容也可以满足需求,而关于ALS的算法这部分就有点困难了,能看到一个比较熟悉的公式,这个来源于吴恩达的机器学习logistic regression,第一个关于波士顿房价预测的例子也是基于这个,当然在movie lens内关于最优的模型选取是根据方根误差率的方式获取,选取方根误差率最低的那个模型为最佳模型,这个和logistic regression中的lose function梯度下降求导的方式到底有什么关联还没有答案,还需要继续学习.
关于lambada架构,很好的解决了离线数据存储和增量数据的计算,对于ML的模型进行增量数据的训练也是一个挑战,我们可以把模型存储到HDFS中,当点击流进入时重新计算模型数据的权重和指标,然后再更新用户相关的模型,在此时就可以发现oryx2.
的好处就是很好的把实时增量的数据和ML的模型训练结合起来对于增量数据进行训练
综上所述,oryx2是目前提供了离线批处理以及实时在线增量计算的一套解决方案,这套基于lambada架构的框架很好的满足了实时推荐+离线训练+存储+数据传输的问题.
接下来就从example开始对于每一层的代码实现进行研究来确定实现的方案.
增加一些参考资料:
基于SVD的推荐算法:https://blog.csdn.net/qq_27717921/article/details/78257450
https://www.cnblogs.com/pinard/p/6351319.html