推荐系统实践-利用社交网络信息
获取社交网络数据的途径:
电子邮件;用户注册信息;用户的位置信息;论坛和讨论组;即时通讯工具;社交网络
社交瓦那个罗分为3种不同的社交网络类型:双向确认的社交网络(人人),单向关注的社交网络(微博),基于社区的社交网络(豆瓣)
社交网络用户的入度近似长尾分部,这说明在一个社交网络中影响力大的用户总是占少数
社会化推荐之所以受到很多网站的重视,因为:
①好友推荐可以增加推荐的信任度;
②社交网络可以解决冷启动问题
考虑用户的熟悉程度以及兴趣相似度,用户u对物品i的兴趣pui可以通过如下公式计算:
wuv由两个部分相似度构成,一部分是用户u对用户v的熟悉程度;另一部分是用户u和用户v的兴趣相似程度。熟悉程度可以定义如下(out(u)是用户u的好友集合):
兴趣相似度定义如下:
其中N(u)是用户u喜欢的物品集合
基于图的社会化推荐算法
该图上有用户顶点(圆圈)和物品顶点(方块)两种顶点
在定义完图的顶点和边后,需要定义边的权重。其中用户之间边的权重可以定义为用户之间相似度的α倍(包含熟悉程度和兴趣相似度)。而用户和物品之间的权重可以定义为用户对物品喜欢程度的β倍。α和β需要根据应用的需求确定。
在社交网络中,还有一种关系,即两个用户属于同一个社群。如下图,可以加入一种节点表示社群,然后使用图推荐算法(比如PersonalRank)给用户推荐物品:
实际系统中的社会化推荐算法
在物品数不是很多的网站,可以很容易地讲物品相关表缓存在内存中,因此查询相关物品的代价很低,所以ItemCF算法很容易在实际环境下实现
另外有两种方法改进基于邻域的社会化推荐算法。第一种方法治标不治本,简单说就是可以做两处截断。第一处截断就是在拿用户好友集合时并不拿出用户所有的好友,而是只拿出和用户相似度最高的N个好友。此外,在查询每个用户的历史行为时,可以只返回最近一个月的行为。
第二种方法需要重新设计数据库。推特的解决方案是给每个用户维护一个消息队列(message queue),当一个用户发表一条微博时,所有关注他的用户的消息队列都会加入这条微博。所以我们可以按照如下方法设计系统:
①首先,为每个用户维护一个消息队列,用于存储他的推荐列表;
②当一个用户喜欢一个物品时,就将(物品ID,用户ID和时间)这条记录写入关注该用户的推荐列表消息队列中;
③当用户访问推荐系统时,读出他的推荐列表消息队列,对于这个消息队列中的每个物品,重新计算该物品的权重。计算权重时需要考虑物品在队列中出现的次数,物品对应的用户和当前用户的熟悉程度、物品的时间戳。
社会化推荐和协同过滤推荐系统
社会化推荐系统往往很难通过离线试验评测,因为社会化推荐的优势不在于增加预测准确度,而是在于通过用户的好友增加用户对推荐结果的信任度,从而让用户点击那些冷门的推荐结果。
目前最流行的信息流推荐算法是Facebook的EdgeRank,该算法综合考虑了信息流中每个会话的时间、长度与用户兴趣的相似度。FB将其他用户对当前用户信息流的会话产生过行为的行为成为Edge,而每一个会话权重定义为:
ue指产生行为的用户和当前用户的相似度,这里的相似度主要是在社交网络图中的熟悉度;
we指行为的权重,这里的行为包括创建、评论、like(喜欢)、打标签等,不同的行为有不同的权重;
de指时间衰减参数,越早的行为对权重的影响越低
不过ER算法的个性化因素仅仅是好友的熟悉度,并没有考虑帖子内容和用户兴趣的相似度。
为此,GroupLens的研究人员JC深入研究了信息流推荐中社会兴趣的个性化兴趣之间的关系,他的排名考虑了如下因素:
①会话的长度;
②话题的相关性;
③用户熟悉程度
试验结果说明,综合考虑用户的社会兴趣和个人兴趣对于提高用户满意度是有帮助的
基于好友的推荐算法可以用来给用户推荐提名在现实中互相熟悉,而在当前社交网络中没有联络的其他用户。
对于用户u和v,我们可以用共同好友比例计算他们的相似度:
def FriendSuggestion(User, G, GT):
suggestions = dict()
friends = G[user]
for fid in G[user]:
for ffid in GT[fid]:
if ffid in friends:
continue
if ffid not in suggestions:
suggestions[ffid] = 0
suggestions[ffid] += 1
suggestions = {x:y / math.sqrt(len(G[user])*len(G[x])for x,y in suggestions)}
但在微博这种有向社交网络中,这两个集合就不同了,因此也可以通过in(u)定义另一种相似度:
同时,我们也可以定义第三种有向的相似度:
但是,这个相似度有一个缺点,就是该相似度的定义下所有人都和名人有很大的相似度,因此可以用如下相似度:
这些相似度的计算无论时间复杂度还是空间复杂度都不是很高非常适合在线应用使用
社交网络研究有两个著名的问题,第一个是如何度量人的重要性,也就是社交网络顶点的中心度(centrality),第二个问题是如何度量社交网络中人和人之间的关系,也就是链接预测。