本文主要是介绍ALS算法原理及python实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、原理篇
我们用人话而不是大段的数学公式来讲讲ALS是怎么一回事。
1.1 你听说过推荐算法么
假如我是豆瓣的CEO,很多豆瓣的用户在豆瓣电影上都会对电影进行评分。那么根据这个评分数据,我们有可能知道这些用户除了自己评过分的电影之外还喜欢或讨厌哪些电影吗?这就是一个典型的推荐问题,解决这一类问题的算法被称为推荐算法。
1.2 什么是协同过滤
协同过滤的英文全称是Collaborative Filtering,简称CF。注意,这不是一款游戏!从字面上分析,协同就是寻找共同点,过滤就是筛选出优质的内容。
1.3 协同过滤的分类
一般来说,协同过滤推荐分为三种类型:
基于用户(user-based)的协同过滤,通过计算用户和用户的相似度找到跟用户A相似的用户B, C, D...再把这些用户喜欢的内容推荐给A;
基于物品(item-based)的协同过滤,通过计算物品和物品的相似度找到跟物品1相似的物品2, 3, 4...再把这些物品推荐给看过物品1的用户们;
基于模型(model based)的协同过滤。主流的方法可以分为:矩阵分解,关联算法,聚类算法,分类算法,回归算法,神经网络。
1.4 矩阵分解
矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积。比如豆瓣电影有m个用户,n个电影。那么用户对电影的评分可以形成一个m行n列的矩阵R,我们可以找到一个m行k列的矩阵U,和一个k行n列的矩阵I,通过U * I来得到矩阵R。
1.5 ALS
如果想通过矩阵分解的方法实现基于模型的协同过滤,ALS是一个不错的选择,其英文全称是Alternating Least Square,翻译过来是交替最小二乘法。假设用户为a,物品为b,评分矩阵为R(m, n),可分解为用户矩阵U(k, m)和物品矩阵I(k, n),其中m, n, k代表矩阵的维度。前方小段数学公式低能预警:
根据矩阵分解的定义,有
1、用MSE作为损失函数,为了方便化简,加法符号左侧的常数改为-1/2
2、对损失函数求U_a的一阶偏导数,那
3、 令一阶偏导数等于0
4、同理,可证
1.6 求解用户矩阵U和物品矩阵I
矩阵R是已知的,我们随机生成用户矩阵U,
1、利用1.5中的式5、R和U求出I
2、利用1.5中的式6、R和I求出U
如此交替地执行步骤1和步骤2,直到算法收敛或者迭代次数超过了最大限制,最终我们用RMSE来评价模型的好坏。
实现篇
本人用全宇宙最简单的编程语言——Python实现了ALS算法,没有依赖任何第三方库,便于学习和使用。
注:代码中用到的Matrix类是我写的一个矩阵类,可以取出矩阵的行或列,计算矩阵的乘法、转置和逆。
2.1 创建ALS类
初始化,存储用户ID、物品ID、用户ID与用户矩阵列号的对应关系、物品ID与物品矩阵列号的对应关系、用户已经看过哪些物品、评分矩阵的Shape以及RMSE。
[Python] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 |
|
2.2 数据预处理
对训练数据进行处理
这篇关于ALS算法原理及python实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!