美文网首页
个性化召回算法LFM & spark ALS

个性化召回算法LFM & spark ALS

作者: 邵红晓 | 来源:发表于2019-09-26 17:48 被阅读0次

    在日常生活中,人们实际上经常使用这种方法,如你哪天突然想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,最近有什么好看的电影,而我们一般更倾向于从兴趣或观点相近的朋友那里得到推荐。这就是协同过滤的思想
    LFM(latent factor model 隐语义模型)算法背景
    https://www.cnblogs.com/ventlam/p/6296255.html,这里有详细介绍
    https://blog.csdn.net/codes_first/article/details/80796151
    https://zhuanlan.zhihu.com/p/28023308 L1&L2个正则化项

    • 也是矩阵分解的一种,隐语义模型
    • 什么是LFM算法 spark ALS是其中一种实现
      1、根据用户对item点击与否等,来获取用户item之间关系,item和item之间的关系等
      2、输入:user对item点展矩阵,模型参数:每一个user的向量表示和每个item的向量表示,行向量乘以列向量是一个常数,user向量和item向量相乘,完全可以拟合点展矩阵中的数值
    • LFM算法应用场景
      1、完成user的item推荐列表
      获取到用户toplike
      2、完成item的相似度列表
      获取到item的topsim(item向量得到,可以计算每个item的相似度矩阵)
      3、完成item之间隐含topic的挖掘
      计算item的topic,使用聚类方法,将item聚合成为不同的类,根据类别推荐
    • LFM建模公式
    image.png

    u-user ;i-item;如果user 点击了item p(u,i)= 1,否则为0,F是向量维度(user对item的影响因素的个数),如何获取到pu,qi,使用监督学习(随机数初始化),然后迭代,无限接近

    • LFM loss function(平方损失函数)


      image.png

      D-所有训练样本的集合
      第一个参数:user是否点击item,点击为1,否则0
      第二个参数:模型预估的user对item的喜好程度

    • L2正则化,增强泛化能力


      image.png
      image.png

    求偏导,β是学习率

    • 采样
    1. 负样本的选取,因为比起正样本,用户的负样本是非常多的,因为展现给用户的item比用户点击的item要多的多,所以需要选取那些充分展现(该item在所有用户中已经有了比较高的item展现次数,我们就可以用用户没有点击的物品中,按照该item在所有用户中的展现次数做降序,去一定数量的item,作为负样本,保证正负样本的均衡)的而用户没有点击的item,作为负样本

    2. 隐特征F,正则参数α,学习率learn rate
      在实验的时候,固定α=0.02,λ=0.01,然后变化F个数,来训练模型,模型快速收敛

    def LatentFactorModel(user_items, F, T, alpha, lamb):
        # https: // blog.csdn.net / codes_first / article / details / 80796151
        InitAllItemSet(user_items)
        # 初始化P,Q矩阵
        [P, Q] = InitModel(user_items, F)
        # 开始迭代
        for step in range(0, T):
            # 从数据集中一次取出user以及该user喜欢的items集合
            for user, items in user_items.items():
                # 随机抽样 为user抽取与items数据量相当的负样本,并且与负样本合并,用户优化技术
                samples = RandSelectNegativeSample(items)
                # 依次取出item和user对该item的兴趣度
                # Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。
                for item, rui in samples.items():
                    # 根据当前参数计算误差,就是矩阵乘法公式
                    eui = rui - Predict(user, item, P, Q)
                    # 优化参数
                    for f in range(0, F):
                        P[user][f] += alpha * (eui * Q[item][f] - lamb * P[user][f])
                        Q[item][f] += alpha * (eui * P[user][f] - lamb * Q[item][f])
            # 每次迭代完成要降低学习率,一开始由于最优化值相差元,下降快
            # 当优化到一定程度,需要放慢学习率,慢慢接近最优值
            alpha *= 0.9
        return P, Q
    
    def Predict(user, item, P, Q):
        rate = 0
        for f, puf in P[user].items():
            qif = Q[item][f]
            rate += puf * qif
        return rate
    
    • 实战案例
      1.数据集
      rating.txt:userid,movieId,rating,timestamp
      movies.txt:movieId,title,grenres(类别)

    相关文章

      网友评论

          本文标题:个性化召回算法LFM & spark ALS

          本文链接:https://www.haomeiwen.com/subject/ocatyctx.html