隐性数据集上应用LFM解决Top-N推荐问题

来源:互联网 发布:qt windows 编辑:程序博客网 时间:2024/05/16 05:08

1 最近在看线性代数的相关知识,昨晚看到矩阵QR分解,然后后面又介绍了一个LFM的分解,说是矩阵能分解出k隐含维数据,看了一眼后面用梯度下降推的公式,感觉好复杂,就没有再往下面看。

2.坐在几个搞推荐的大神旁边,整天听到“转化率”,“反馈”什么的,因为本身不是搞这个方向的,所以听起来挺神奇。

3.刚好在CSDN上看到一篇讲LFM隐语义应用在推荐系统上的文章,想到能复习一下线代上将的内容又能了解一下推荐系统,就做了下面的研究。推到了公式,但是算法还没有具体实现,后面会附上参考伪代码

浅谈推荐系统

之前很早就听说过关于推荐的那个“啤酒尿布”的故事,这次学习推荐系统了解到:

专业术语解释:

  • UserCF:User Collaborative Filter(用户协同过滤)
  • itemCF:Item Collaborative Filter(项/元素协同过滤)
  • 显性反馈:用户行为的一种反馈,包含正样本和负样本
  • 隐性反馈:只包含正样本,不包含负样本

关于推荐的几个思路:

  1. UserCF:给用户B推荐的商品是和用户B相似的用户A相关的商品
  2. ItemCF:给用户推荐的商品是根据用户之前拥有的商品决定的
  3. 兴趣分类:
    3.1. 传统分类不适合复杂场景
    3.2. LFM(隐含语义分析)接下来要讲的内容

隐性语义

因为之前做的项目,有幸了解到NLP领域隐含主题模型LDA,模型认为一片文章讲道理是由多个主题构成的,而多个主题下面又包含关于这个主题的词语,即:doc-topic-word。利用该模型能够挖掘到文章之间隐含的主题关系,根据隐含主题的关联关系可以确定出文章之间的关系。和LDA相关的叫做隐含语义分析技术。隐含语义分析技术采用基于用户行为统计的自动聚类,挖掘出a-latent-b的关系。

  • 依据用户行为自动的进行分类,而非认为的确定类别个数
  • 可以确定要分类的类别数量,数量多,粒度细
  • 可以计算出物品属于某个类别的权重,哪个物品能够更好的代表这个类别,实现软分类

应用实例

在豆瓣图书推荐栏目,根据用户浏览的,购买的,收藏的关于图书的行为记录数据,要推荐给用户合适的图书。怎么实现图书推荐呢?这里主要根据LFM原理进行解释。假设有关于用户喜爱书籍的表格如下所示:

|
|——-|——–|——–|——-|
|user1: |侦探小说|科普 |计算机 |
| user2:| 数学 |机器学习| |
| … | … | … | … |

LFM矩阵分解

根据线性代数中的知识可知:将一个 mn的矩阵 Amn可以分解为具有 k个隐变量的 UmkVkm的矩阵。这里的维数 k就是隐含变量的个数,也就是latent factor

Amn=UmkVkm

现假定有3个用户user1user2user3。他们各自分别对标记为item1item2item3item4的图书(商品)的喜爱程度可形成一个34user-item兴趣矩阵R34

这里写图片描述

根据前面讲的LFM关于矩阵分解的知识,我们可以将这个34user-item矩阵R34分解为含有3个隐含变量的P33Q34的矩阵,其中P33表示用户对隐含类别的兴趣矩阵user-latent,而Q34表示图书(商品)在隐含类别中所占权重的矩阵。即:

R34=P33Q34

这里写图片描述

故,对用户商品user-item矩阵R中的每一个ru,i(用户u对商品i的喜爱程度),可以通过矩阵分解式

ru,i=puqi=k=1Kpu,kqki
进行表示。

让我们梳理一下逻辑

  1. 现要依据P,Q参数矩阵来估计R矩阵中的某个估计量r¯u,i,总体思路采用损失函数最小化来求取参数矩阵P,Q
  2. 这里对R矩阵中样本的选取要注意:由于采用的是隐性反馈,只有正样本,没有负样本,所以要依据一定的原则选取合适数量的负样本。在样本选定后进行参数估计。

样本选取原则:1.样本中包含正,负标记的样本数量相当;2.在推荐系统中负样本侧重选择热门商品中用户没有点击的那些

故,对k个样本集中的样本(u,i)以及对应的标记ru,i,有下面的损失函数表示:

c=(u,i)k(ru,ir¯u,i)2=(u,i)k(ru,ik=1Kpu,kqki)2+λpu2+λqi2

其中:
1 第一个等号右边的表达式总体上表示了标记实际值ru,i与估计值r¯u,i 之间差值平方,我们的目标就是将这个损失函数最小化,求得在最小化值下的P,Q参数矩阵。

2 后面带λ的两项为正则化项,是用来防止过拟合的。这里解释一下两个竖线表示2范数

3 这里损失函数最小化可以使用梯度下降法求得对应pu,kqi,k的偏导数,利用一个α学习速率每次迭代pu,kqi,k的值,直至达到阈值。

我们对上面的损失函数c分别对pu,kqi,k求偏导数,得:

这里写图片描述

通过确定学习速率λ,来对pu,kqi,k进行优化:

这里写图片描述

总结

由此可以看出模型需要确定的几个参数:
1. 隐变量的个数F
2. 梯度下降法迭代的次数:N
3. 梯度下降学习速率:α
4. 正则化项对应的参数:λ

最后贴上python版本的伪代码:

def LFM(user_items, F, N, alpha, lambda):        [P, Q] = InitModel(user_items, F)      For step in range(0, N):           for user, items in user_item.iterms():               samples = RandSelectNegativeSamples(items)              for item, rui in samples.items():                  eui = eui - Predict(user, item)                  for f in range(0, F):                      P[user][f] += alpha * (eui * Q[f][item] - lambda * P[user][f])                      Q[f][item] += alpha * (eui * P[user][f] - lambda * Q[f][item])            alpha *= 0.9  
0 0
原创粉丝点击