文章目录
- 目录
- 1.什么是用户行为数据?
- 1.1用户行为分类
- 2.用户行为数据如何使用?
- 2.1 用户活跃度和物品流行度的分布
- 2.2 用户活跃度和物品流行度的关系
- 2.3 协同过滤算法
- 3.实验设计和算法评测
- 4.基于邻域的的推荐算法
- 4.1 基于用户的协同过滤算法
- 4.2 基于物品的协同过滤算法
- 4.3 userCF和itemCF的比较
- 5.基于隐语义模型的推荐算法
- 6.基于图模型的推荐算法
目录
1.什么是用户行为数据?
用户行为数据在网站上最简单的存在形式为日志。很多互联网业务会把多种原始日志按照用户行为汇总成会话日志,其中会话表示一次用户行为和对应的服务。如电子商务网站记录的用户行为包括网页浏览、购买、点击、评分和评论等。
1.1用户行为分类
1.按照反馈的明确性分
- 显示反馈行为
对某些物品的喜欢、不喜欢;对某条事物的评论 - 隐性反馈行为
指的是那些不能明确反应用户喜好的行为。代表性的为页面浏览行为。用户浏览一个页面并不代表用户喜欢这个页面展示的物品,可能是因为页面链接显示在首页,用户更容易点击它,隐性反馈虽然不明确,但数据量更大。在很多网站中,可能只有隐性反馈而没有显性反馈。
下面是一个各代表网站中的一些对比:
2.按照反馈的方向分:
- 正反馈
用户的行为倾向于喜欢 - 负反馈
用户的行为倾向于不喜欢
2.用户行为数据如何使用?
2.1 用户活跃度和物品流行度的分布
长尾分布:
1 物品流行度的长尾分布
2 用户活跃度的长尾分布
2.2 用户活跃度和物品流行度的关系
- 一般的,不活跃的用户要么是新用户,要么是只来过网站一两次的老用户。
- 一般的,新用户倾向于浏览热门的物品,因为他们对网站不熟悉,只能点击热门物品 ,而老用户会逐渐开始浏览冷门的物品
2.3 协同过滤算法
- 协同过滤算法:仅仅基于用户行为数据设计的推荐算法
- 经协同过滤算法的深入研究,又提出了很多方法,比如基于邻域的方法(neghborhood-based)、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph)
广泛应用并最著名的是基于邻域的方法,主要包含下面两种算法:
- 1 基于用户的协同过滤算法:给用户推荐和他兴趣相似的其他用户喜欢的物品
- 2 基于物品的协同过滤算法:给用户推荐和他之前喜欢的物品相似的物品
3.实验设计和算法评测
def SplitData(data,M,k,seed):test = []train = []random.seed(seed)for user, item in data:if random.randint(0,M) == k:test.append([user,item])else:train.append([user,item])return train,test
召回率描述有多少比例的用户—物品评分记录包含在最终的推荐列表中,而精确率描述最终 的推荐列表中有多少比例是发生过的用户—物品评分记录。下面两段代码给出了召回率和准确率 的计算方法
def Recall(train ,test ,N):hit = 0all = 0for user in train.keys():tu =test[user]rank = GetRecommendation(user,N)for item,pui in rank:if item in tu:hit +=1all +=len(tu)return hit/(all * 1.0)def Precision(train, test, N): hit = 0 all = 0 for user in train.keys(): tu = test[user] rank = GetRecommendation(user, N) for item, pui in rank: if item in tu: hit += 1 all += N return hit / (all * 1.0)
def Coverage(train, test, N): recommend_items = set()all_items = set() for user in train.keys():for item in train[user].keys(): all_items.add(item) rank = GetRecommendation(user, N) for item, pui in rank: recommend_items.add(item) return len(recommend_items) / (len(all_items) * 1.0)
4.基于邻域的的推荐算法
4.1 基于用户的协同过滤算法
性能分析指标:
-
准确率和召回率 可以看到,推荐系统的精度指标(准确率和召回率)并不和参数K成线 性关系。在MovieLens数据集中,选择K=80左右会获得比较高的准确率和召回率。因此选 择合适的K对于获得高的推荐系统精度比较重要。当然,推荐结果的精度对K也不是特别 敏感,只要选在一定的区域内,就可以获得不错的精度。
-
流行度 可以看到,在3个数据集上K越大则UserCF推荐结果就越热门。这是因为K决定 了UserCF在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果K越大,参 考的人越多,结果就越来越趋近于全局热门的物品。
-
覆盖率 可以看到,在3个数据集上,K越大则UserCF推荐结果的覆盖率越低。覆盖率的 降低是因为流行度的增加,随着流行度增加,UserCF越来越倾向于推荐热门的物品,从 而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。
为了避免全部推送的都是热门的产品,我们需要对热门的产品进行惩罚
4.2 基于物品的协同过滤算法
4.3 userCF和itemCF的比较
UserCF的推荐更社会化,反映了用户所在的 小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承
在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。即使是个性 化,也是比较粗粒度的,比如有些用户喜欢体育新闻,有些喜欢社会新闻,而特别细粒度的个性 化一般是不存在的。比方说,很少有用户只看某个话题的新闻,主要是因为这个话题不可能保证 每天都有新的消息,而这个用户却是每天都要看新闻的。因此,个性化新闻推荐更加强调抓住 新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因 此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热 点和时效性的同时,保证了一定程度的个性化。这是Digg在新闻推荐中使用UserCF的最重要 原因。
UserCF适合用于新闻推荐的另一个原因是从技术角度考量的。因为作为一种物品,新闻的更 新非常快,每时每刻都有新内容出现,而ItemCF需要维护一张物品相关度的表,如果物品更新很 快,那么这张表也需要很快更新,这在技术上很难实现。绝大多数物品相关度表都只能做到一天 一次更新,这在新闻领域是不可以接受的。而UserCF只需要用户相似性表,虽然UserCF对于新 用户也需要更新相似度表,但在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且 对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。
但是,在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发 挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。一个技术人员可能都是在购买 技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看 的书就越可能不热门。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的 好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的 任务是帮助用户发现和他研究领域相关的物品。因此,ItemCF算法成为了这些网站的首选算法。 此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成 太大的损失,是可以接受的。
同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品 相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间, 同理,如果物品很多,那么维护物品相似度矩阵代价较大。 在早期的研究中,大部分研究人员都是让少量的用户对大量的物品进行评价,然后研究用 户兴趣的模式。那么,对于他们来说,因为用户很少,计算用户兴趣相似度是最快也是最简单 的方法。但在实际的互联网中,用户数目往往非常庞大,而在图书、电子商务网站中,物品的 数目则是比较少的。此外,物品的相似度相对于用户的兴趣一般比较稳定,因此使用ItemCF是 比较好的选择。当然,新闻网站是个例外,在那儿,物品的相似度变化很快,物品数目庞大, 相反用户兴趣则相对固定(都是喜欢看热门的),所以新闻网站的个性化推荐使用UserCF算法的 更多。
新闻网站的个性化推荐使用UserCF算法的 更多
5.基于隐语义模型的推荐算法
LFM(latent factor model)隐语义模型的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品,采取基于用户行为统计的自动聚类。
隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。隐含语义分析技术允许我们指定最终有多少个分类,这个数字越大,分类的粒度就会越细,反正分类粒度就越粗。隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个
物品在这个类中的权重就可能比较高。
LFM通过如下公式计算用户u对物品i的兴趣:
这个公式中p(u,k)和q(i,k)是模型的参数,其中p(u,k)度量了用户u的兴趣和第k个隐类的关系,而q(i,k)度量了第k个隐类和物品i之间的关系。这两个参数是从数据集中计算出来的。要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。推荐系统的用户行为分为显性反馈和隐性反馈。LFM在显性反馈数据(也就是评分数据)上解决评分预测问题并达到了很好的精度。不过这里主要讨论的是隐性反馈数据集,这种数据集的特点是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)。对负样本采样时应该遵循以下原则:
对每个用户,要保证正负样本的平衡(数目相似)。
对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
下面的Python代码实现了负样本采样过程:
def RandomSelectNegativeSample(self, items):ret = dict()for i in items.keys():ret[i] = 1n = 0for i in range(0, len(items) * 3):item = items_pool[random.randint(0, len(items_pool) - 1)]if item in ret:continueret[item] = 0n + = 1if n > len(items):break
def LatentFactorModel(user_items, F, N, alpha, lambda):[P, Q] = InitModel(user_items, F)for step in range(0,N):for user, items in user_items.items():samples = RandSelectNegativeSamples(items)for item, rui in samples.items():eui = rui - Predict(user, item)for f in range(0, F):P[user][f] += alpha * (eui * Q[item][f] - lambda * P[user][f])Q[item][f] += alpha * (eui * P[user][f] - lambda * Q[item][f])alpha *= 0.9def Recommend(user, P, Q):rank = dict()for f, puf in P[user].items():for i, qfi in Q[f].items():if i not in rank:rank[i] += puf * qfireturn rank
综上在LFM中,重要的参数有4个:隐特征的个数F;学习速率alpha;正则化参数lambda;负样本/正样本比例 ratio。通过实验发现,ratio参数对LFM的性能影响最大。
6.基于图模型的推荐算法
如上,用户A对物品a,b,d有行为。
- 表示成二分图之后,给用户u推荐物品可以转化为度量用户顶点vuvu没有边直连的物品节点在图上的相关性,相关性越高的物品在推荐列表中权重越高。顶点的相关性主要体现在如下方面:
- 两个顶点之间的路径数
利用随机游走的personalRank算法来为用户推荐物品:
假定要给用户u进行个性化推荐,可以从用户u对应的节点vuvu节点重新游走,如果继续游走,那么从当前节点指向的节点按照均匀分布随机选择一个节点作为游走下次经过的节点。
这样重复之后,每个物品节点被访问的概率收敛到一个数,最终的推荐列表中物品的权重就是物品节点的访问概率。
- 缺点时间复杂度方面有明显的缺点,在为每个用户推荐的时候都需要在整个二分图上迭代,直到整个图上的PR(v)收敛,耗时。解决
- 减少迭代次数,但是会影响精度
讲PR转换成为矩阵的形式,令M为用户物品二分图的转移概率矩阵,即:
只需要计算一次(1−αMT)−1(1−αMT)−1即可。