LFM(Latentfactormodel)隐语义模型算法原理以及代码实践简介
协同过滤(collaborative filtering)是⼀种在推荐系统中⼴泛使⽤的技术。该技术通过分析⽤户或者事物之间的相似性,来预测⽤户可能感兴趣的内容并将此内容推荐给⽤户。这⾥的相似性可以是⼈⼝特征的相似性,也可以是历史浏览内容的相似性,还可以是个⼈通过⼀定机制给与某个事物的回应。⽐如,A和B是⽆话不谈的好朋友,并且都喜欢看电影,那么协同过滤会认为A和B的相似度很⾼,会将A喜欢但是B没有关注的电影推荐给B,反之亦然。
协同过滤推荐分为3种类型:
基于⽤户(user-based)的协同过滤(UserCF)
基于物品(item-based)的协同过滤(ItemCF算法)
基于模型(model-based)的协同过滤 (ModelCF算法)
本⽂主要讲述基于矩阵分解的隐语义(LFM)模型算法的原理以及代码实现。
算法原理
之前两篇⽂章分别讲过UserCF算法和ItemCF算法,⾸先回想⼀下这两种⽅法是如何进⾏⼯作的,还是以电影推荐为例。
UserCF
对于⽤户A,⾸先到与其最相似的⽤户B,然后给A推荐B喜欢的电影。
ItemCF
对于⽤户A,⾸先到与A看过的电影最相似的电影,然后给A推荐这些电影。
总的来说,UserCF是计算⽤户之间的相似性,ItemCF是计算物品之间的相似性。那还有什么⽅法可以⽤于电影推荐么?
我们浏览电影⽹站的时候,可以看到顶部⼀般会有很多分类,⽐如喜剧、动作、科幻、爱情、悬疑、恐怖等。对于我⽽⾔,我⼀般⽐较喜欢看喜剧、科幻、动作⽚等,因此如果⽹站给我推送这⼏种类型的电影,我是有较⼤概率去点击观看的。但是如果给推送⾔情、古装、穿越等题材的电影则根本激不起我的兴趣。
因此我们⾸先可以对电影进⾏分类,接着得到⽤户对每⼀种电影类型的感兴趣度,然后挑出⽤户最感兴趣的那个类别,挑选出属于那个类别的电影推荐给⽤户。
我们⾸先来量化⼀下⽤户的感兴趣程度,使⽤0到1范围内的数字来代表⽤户对某种电影类型的感兴趣程度,从0到1依次代表喜欢程度加深。
假如我们现在有8个分类标签,分别是喜剧、动作、科幻、爱情、悬疑、恐怖、剧情、冒险,以⽤户A为例,A可能会做出以下评分:喜剧动作科幻爱情悬疑恐怖剧情冒险
A0.80.50.60.60.40.20.30.6
现在有两部电影,分别是《钢铁侠3》和《傲慢与偏见》,通过看电影介绍,我们知道《钢铁侠3》包含了动作、科幻、冒险3个标签,《傲慢与偏见》包含了剧情、爱情两个标签。
我们假设这两部电影对这8个标签的符合程度如下:
喜剧动作科幻爱情悬疑恐怖剧情冒险
钢铁侠300.70.900000.6
傲慢与偏见0000.9000.90
我们可以计算出A对《钢铁侠3》的喜欢程度为: 0.5x0.7+0.9x0.6+0.6x0.6 = 1.25。同理,A对《傲慢与偏见》的喜欢程度为:
0.9x0.6+0.3x0.9=0.81。
图1
有个叫什么代码的电影上图中,我们令R代表⽤户对电影的评分数据,这是我们已有的数据集。令P代表⽤户对电影类别的感兴趣程度,令Q为每部电影对每个类别的符合程度,因此可得PQ=R。
由于我们已有的数据集是R,要求P和Q,⾸先可能会想到SVD矩阵分解,但是有⼀个很⼤的问题,就是SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空⽩。⽽我们的原始数据集有很多缺失值,因为不可能每个⽤户都会对每⼀件商品进⾏评分。
下⾯我们来看下LFM算法是如何解决这个问题的。令代表的是⽤户对物品的感兴趣程度,定义如下:
是模型的参数,也就是分别上图中的P矩阵和Q矩阵,其中代表的含义是⽤户对第个分类的感兴趣程度,代表的是第个物品与第个分类的符合程度。
损失函数如下所⽰:
算法:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。