概要:mysql
随着电子商务的高速发展和普及应用,个性化推荐的推荐系统已成为一个重要研究领域。
个性化推荐算法是推荐系统中最核心的技术,在很大程度上决定了电子商务推荐系统性能的优劣,决定着是否可以推荐用户真正感兴趣的信息,而面对用户的不断提高的需求,推荐系统不只须要正确的推荐,还要实时地根据用户的行为进行分析并推荐最新的 结果。
实时推荐系统的任务就是为每一个用户,不断地、精准地推送个性化的服务,甚至到达让用户体会到推荐系统比他们更了解本身的感受。linux
本文主要研究的是基于模型的协同过滤算法—ALS以及实时推荐系统的可行性并详细讲解ALS(交替最小二乘法)的思想
而后在Spark Streaming框架上运用ALS算法进行测试,评估实时推荐中算法的可靠性
最后,在Spark Mllib和Streaming框架上构建了实时推荐引擎,将推荐数据保存在Hbase中,WebApp经过读取Hbase中的推荐数据来向用户展现推荐结果web
关于其余类别的推荐算法就不细说了,网上有不少的资料查看,推荐几篇文章:
IBM-探索推荐引擎内部的秘密系列算法
以及向亮的《推荐系统实践》
下载地址sql
下面进入正文数据库
基于矩阵分解的协同过滤算法–ALS:编程
基于模型的协同过滤推荐就是基于样本的用户喜爱信息,训练一个推荐模型,而后根据实时的用户喜爱的信息进行预测,计算推荐。数组
对于一个users-products-rating的评分数据集,ALS会创建一个user*product的m*n的矩阵(其中,m为users的数量,n为products的数量),以下图:缓存
这个矩阵的每一行表明一个用户 (u1,u2,…,u9)、每一列表明一个产品 (v1,v2,…,v9)。用户隔天产品的打分在 1-9 之间。
可是在这个数据集中,并非每一个用户都对每一个产品进行过评分,因此这个矩阵每每是稀疏的,用户i对产品j的评分每每是空的
ALS所作的事情就是将这个稀疏矩阵经过必定的规律填满,这样就能够从矩阵中获得任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分
因此说,ALS算法的核心就是经过什么样子的规律来填满(预测)这个稀疏矩阵
它是这么作的:
假设m*n的评分矩阵R,能够被近似分解成U*(V)T
U为m*d的用户特征向量矩阵
V为n*d的产品特征向量矩阵((V)T表明V的转置)
d为user/product的特征值的数量数据结构
关于d这个值的理解,大概能够是这样的:
对于每一个产品,能够从d个角度进行评价,以电影为例,能够从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4
能够认为,每部电影在这4个角度上都有一个固定的基准评分值
例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的
d=4,有4个特征值,分别是主演,导演,特效,剧情
每一个特征值的基准评分值分别为(满分为1.0):
主演:0.9
导演:0.7
特效:0.8
剧情:0.6
矩阵V由n个product*d个特征值组成
对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在必定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)
其中a1-4为用户A的特征值,d1-4为以前所说的电影的特征值
那么对于以前ALS算法的这个假设
m*n的评分矩阵R,能够被近似分解成U*(V)T
就是成立的,某个用户对某个产品的评分能够经过矩阵U某行和矩阵V(转置)的某列相乘获得
那么如今的问题是,如何肯定用户和产品的特征值?(以前仅仅是举例子,实际中这两个都是未知的变量)
采用的是交替的最小二乘法
在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另一部分表示用户i的特征向量(转置)*产品j的特征向量(这里能够获得预测的i对j的评分)
用真实评分减去预测评分而后求平方,对下一个用户,下一个产品进行相同的计算,将全部结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并无实际的评分,解决的方法是就只看对已知打分的项)
可是这里以前问题仍是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量
解决的办法是交替的最小二乘法
首先对于上面的公式,如下面的形式显示:
为了防止过分拟合,加上正则化参数
首先用一个小于1的随机数初始化V
根据公式(4)求U
此时就能够获得初始的UV矩阵了,计算上面说过的差平方和
根据计算获得的U和公式(5),从新计算并覆盖V,计算差平方和
反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数知足要求则中止
取得最新的UV矩阵
则本来的稀疏矩阵R就能够用R=U(V)T来表示了
ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积
交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小
经过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分
算法原理讲述完毕,接下来进行算法测试
算法测试:
算法测试分为两部分:
1、测试最佳的参数,如:隐性因子个数,正则式等
2、测试在Streaming框架上算法的可用性
测试数据集来自MovieLens
测试一:
将整个数据集上传至HDFS中
在spark程序中读取ratings.dat文件,并随机划出80%做为训练数据集,20%做为测试数据集
设置隐性因子、正则式参数列表(因为物理机配置很差,集群可以支持的最大迭代次数只有7次,在多就会内存溢出,因此这里直接将迭代次数设置为7)
对参数列表的全排列分别进行模型训练,并计算MSE、RMSE
结果以下图:
比较得出最佳的参数组合,之后的模型训练参数都使用这个参数组合
测试二:
将本来的数据划分为三部分
trainingData-10k
testData-10k
剩下的为streamData,做为流数据实时发送
首先将trainingData、testData上传到HDFS/data目录下
在spark程序中读取,并转化为RDD[Rating]类型
使用Streaming框架接受流数据,并进行在线模型训练
每训练一次就计算一次MSE和RMSE
对比模型的精准性有没有提升
使用Scala读取本地的streamData,经过Socket发送到spark程序中
结果以下图:
随着数据的不断增长,模型的精准度在不断的提升,因此实时的更新推荐模型是可行的
推荐系统整合:
总体流程图:
首先用程序生成用户和图书数据,并随机模拟用户行为数据,保存在Hbase中
在Hbase数据库中包含了用户表(4000个用户),图书表(5060本图书)以及评分表(用户对图书的百万条数据)
因为对我的来讲没法获得真实的商业性数据,故评分数据都是程序 模拟随机生成的,包括实时发送的流数据,因此这可能会对整个系统的推荐结果带来影响
另外,除了WebUI部分,其他的程序都是运行在Linux的Spark集群上
原始数据经过一个程序不断地向Hbase的评分表中写入数据
模拟用户在网站上的评分行为
运行截图:
其中,前300个用户的行为偏向于前600本图书(计算机相关)
实时流数据将经过另一个程序发送Socket数据,模拟用户当前在网站上的实时评分行为
在最后使用用户进行观察测试时,程序将会只模拟这个用户的评分行为以便观察推荐系统的实时性
首先推荐引擎会读取Hbase中的评分数据
并使用算法测试时获得的最佳参数组合来对其进行训练
获得初始的模型
使用这个模型对Hbase中全部用户进行图书推荐(取 top10)
并将推荐结果保存在Hbase中
以上阶段为系统初始化阶段
运行截图:
在系统初始化完成以后,开启实时推荐引擎
接收不断生成的用户行为数据,并和Hbase中的原始数据混合,训练出新的模型,产生推荐结果保存
不断地进行流数据的读取、训练和保存推荐结果,直至系统关闭或者无流数据产生
推荐引擎运行以下图:
WebUI部分:
WebUI是由ASP.NET开发的一个简单的B/S应用,经过Thrift和Linux中的Hbase交互 选择使用一个用户观察系统的实时推荐性,此时流数据模拟程序只产生这个用户的评分行为 Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载Spark与kafka整合之实时流计算机器学习实战,源码深度剖析,实时流处理,机器学习,数据分析视频教程网盘下载