文章目录
推荐系统Spark实现
推荐系统模型是基于协同过滤思想实现
- 基于用户的协同过滤(User)
- 基于物品的协同过滤(Item)
相关概念
相似度
概念:无论是基于用户还是基于物品的推荐,其本质思想是计算用户和用户之间的相似度,或者计算物品和物品之间相似度,所以我们可以用常见的一些距离来进行衡量,比如欧氏距离,马氏距离,曼哈顿距离等,也可以使用夹角余弦相似度来衡量。目前,主流做法是通过夹角余弦相似度来实现。
- 基于欧式距离‘
- 基于向量夹角余弦
cosθ = 1完全正相关
0 < cosθ < 1 一定程度的正相关
cos90 = 0 没有相关性
-1 < cosθ < 0 一定程度的负相关
cosθ = -1 完全负相关
偏好矩阵
但是生产环境中偏好矩阵往往是稀疏的
所以需要对空缺值进行处理,不能简单设置为0或者某个特定值,因为会导致最后计算的相似度不够准确,使得最终的推荐系统模型失去价值。所以需要某种算法将空缺值预测出来。
ALS算法(交替最小二乘法)
原理:多次迭代,求解一系列最小二乘法回归问题。每一次迭代时,固定(随机生成因子值)某一个因子矩阵,更新另外一个因子矩阵,然后计算误差平方和,如此迭代,直到模型收敛。
ALS只计算已知打分的重构误差
核心代码
这是ALS算法类的源码
case class Rating(user: Int, product: Int, rating: Double)
其中Rating是固定的ALS输入格式,它要求是一个元组类型的数据,其中的数值分别为[Int,Int,Double],因此在数据集建立时,用户名和物品名分别用数值代替,而最后的评分没有变化。
在这个类里,ALS.tran方法是最为重要的方法。这个方法有几个重要参数:
- 1)numBlocks:并行计算的block数(-1为自动配置);
- 2)rank:对应ALS模型中的因子个数,也就是在低阶近似矩阵中的隐含特征个数。因子个数一般越多越好。但它也会直接影响模型训练和保存时所需的内存开销,尤其是在用户和物品很多的时候。因此实践中该参数常作为训练效果与系统开销之间的调节参数。通常,其合理取值为10到200。
- 3)iterations:对应运行时的迭代次数。ALS能确保每次迭代都能降低评级矩阵的重建误差,但一般经少数次迭代后ALS模型便已能收敛为一个比较合理的好模型。这样,大部分情况下都没必要迭代太多次(10次左右一般就挺好)
- 4)lambda:ALS中的正则化参数,控制模型的过拟合情况。其值越高