ALS算法原理及python实现

本文详细介绍了ALS(交替最小二乘法)算法的原理,包括协同过滤的概念和分类,重点讲解了矩阵分解及其在推荐系统中的应用。同时,通过Python代码展示了如何从头实现一个简单的ALS算法,包括数据预处理、矩阵运算和效果评估,以求解用户矩阵和物品矩阵,并计算RMSE来衡量模型性能。
摘要由CSDN通过智能技术生成

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

class ALS(object):

    def __init__(self):

        self.user_ids = None

        self.item_ids = None

        self.user_ids_dict = None

        self.item_ids_dict = None

        self.user_matrix = None

        self.item_matrix = None

        self.user_items = None

        self.shape = None

        self.rmse = None


2.2 数据预处理
        对训练数据进行处理,得到用户ID、物品ID、用户ID与用户矩阵列号的对应关系、物品ID与物品矩阵列号的对应关系、评分矩阵的Shape、评分矩阵及评分矩阵的转置。

[Python] 纯文本查看 复制代码

?

01

02

03

04

05

06

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值