推荐系统实践读书笔记-06利用社交网络数据

自从搜索引擎谷歌诞生后,大家都在讨论互联网的下一个金矿是什么。现在,几乎所有的人都认为那就是社交网络。根据尼尔森2010年的报告,用户在互联网上22%的时间花费在社交网站和社交媒体上。Facebook和Twitter作为两种不同类型社交网络的代表,是目前互联网界的宠儿。谷歌公司也不甘落后,连续推出了很多社交网络产品(Buzz和Google Plus)。国内的互联网以新浪微博为代表,也吸引了很多人的眼球。

基于社交网络的推荐可以很好地模拟现实社会。在现实社会中,很多时候我们都是通过朋友获得推荐。美国著名的第三方调查机构尼尔森调查了影响用户相信某个推荐的因素。调查结果显示,90%的用户相信朋友对他们的推荐,70%的用户相信网上其他用户对广告商品的评论。从该调查可以看到,好友的推荐对于增加用户对推荐结果的信任度非常重要。

为了进一步证实好友推荐对用户的影响,尼尔森和Facebook合作进行了一次个性化广告实验。尼尔森测试了同一个品牌的3种不同形式的广告。第一种广告和第二种广告都是图片广告,但两者的推荐理由不同。第一种广告的推荐理由没有社会化信息,仅仅是表示该品牌受到了51 930个用户的关注,而第二种广告的推荐理由是用户的某些好友关注了这个广告。第三种广告比较特别,它是在用户的好友关注该品牌时,就在用户的信息流中加入一条信息,告诉用户他的某个好友关注了一个品牌。通过在线AB测试,尼尔森发现第三种广告的效果明显高于第二种,而第二种广告的效果明显高于第一种,从而证明了社会化推荐对于增加用户对广告的印象和购买意愿具有非常强烈的作用。同时,该实验也从侧面说明社交网络在推荐系统中可能具有重要的作用。

本章将详细讨论如何利用社交网络数据给用户进行个性化推荐。本章不仅讨论如何利用社交网络给用户推荐物品,而且将讨论如何利用社交网络给用户推荐好友。

文章目录

  • 推荐系统实践读书笔记-06利用社交网络数据
    • 6.1 获取社交网络数据的途径
      • 6.1.1 电子邮件
      • 6.1.2 用户注册信息
      • 6.1.3 用户的位置数据
      • 6.1.4 论坛和讨论组
      • 6.1.5 即时聊天工具
      • 6.1.6 社交网站
    • 6.2 社交网络数据简介
    • 6.3 基于社交网络的推荐
      • 6.3.1 基于邻域的社会化推荐算法
      • 6.3.2 基于图的社会化推荐算法
      • 6.3.3 实际系统中的社会化推荐算法
      • 6.3.4 社会化推荐系统和协同过滤推荐系统
      • 6.3.5 信息流推荐
    • 6.4 给用户推荐好友
      • 6.4.1 基于内容的匹配
      • 6.4.2 基于共同兴趣的好友推荐
      • 6.4.3 基于社交网络图的好友推荐
      • 6.4.4 基于用户调查的好友推荐算法对比
    • 6.5 扩展阅读

6.1 获取社交网络数据的途径

现在互联网上充斥着各种各样带有社交性质的网站。那么,从什么方面可以获得社交网络数据呢?一般来说,有如下方式。

6.1.1 电子邮件

电子邮件诞生于1971年,因此它的历史比因特网还要久远。但就是这个互联网里古董级的应用,其实是一种社交工具。我们可以通过分析用户的联系人列表了解用户的好友信息,而且可以进一步通过研究两个用户之间的邮件往来频繁程度度量两个用户的熟悉程度。

不过,电子邮件是一个封闭的系统,一般的研究人员很难得到用户的联系人列表和用户之间的来往信件。所以对电子邮件中社交关系的研究集中在一些有大型电子邮件系统的公司中。比如,谷歌在2010年的KDD会议上发表了一篇文章,其中就研究了如何通过Gmail系统中、一些不违反隐私协议的数据预测用户之间的社交关系,以便给用户推荐好友的问题。

其实,如果我们获得了用户的邮箱,也可以通过邮箱后缀得到一定的社交关系信息。一般来说,邮箱名是name@xxx.xxx的格式。如果用户用的是公司邮箱,那么我们可以根据后缀知道哪些用户是同一家公司的。同一家公司的用户可能互相认识,因而我们也可以获得一种隐性的社交关系。正是由于电子邮件系统包含了用户的大量社交信息,很多社交网站(如图6-1所示)都在用户注册时提供了让用户从电子邮件联系人中导入好友关系的功能,用以解决社交网络的冷起动问题。

6.1.2 用户注册信息

有些网站需要用户在注册时填写一些诸如公司、学校等信息(如图6-2所示)。有了这些信息后,我们就可以知道哪些用户曾经在同一家公司工作过,哪些用户曾经在同一个学校学习过。这也是一种隐性的社交网络数据。

6.1.3 用户的位置数据

在网页上最容易拿到的用户位置信息就是IP地址。对于手机等移动设备,我们可以拿到更详细的GPS数据。位置信息也是一种反映用户社交关系的数据。一般来说,在给定位置信息后,可以通过查表知道用户访问时的地址。这种地址在某些时候不太精确,只能精确到城市级别,但在有些时候可以精确到学校里的某栋宿舍楼或者某家公司。那么,我们也可以合理地假设同一栋宿舍楼或同一家公司的用户可能有好友关系。

6.1.4 论坛和讨论组

论坛是Web 1.0的产品,它允许用户在一个讨论区就某一类话题进行讨论。比如,豆瓣上有很多小组,每个小组都包含一些志同道合的人。如果两个用户同时加入了很多不同的小组,我们可以认为这两个用户很可能互相了解或者具有相似的兴趣。如果两个用户在讨论组中曾经就某一个帖子共同进行过讨论,那就更加说明他们之间的熟悉程度或兴趣相似度很高。

6.1.5 即时聊天工具

和电子邮件一样,即时聊天工具也是一个早于Facebook和Twitter的早期互联网社交应用。它可以让用户在网上实时地通过文字、语音和视频等方式进行交流。很多即时聊天工具往往都和电子邮件系统深度集成,比如MSN、GTalk都依赖于自己的电子邮件系统,而国产的即时聊天工具QQ后来也集成了QQ邮件系统。

和电子邮件系统一样,用户在即时聊天工具上也会有一个联系人列表,而且往往还会给联系人进行分组。通过这个列表和分组信息,我们就可以知道用户的社交网络关系,而通过统计用户之间聊天的频繁程度,可以度量出用户之间的熟悉程度。

但是,即时聊天工具和电子邮件一样,也是一个封闭的系统,获取用户的即时聊天信息是非常困难的,这里面存在着很多隐私问题。一般来说,绝大部分用户不会公开他们的联系人列表和聊天记录。

6.1.6 社交网站

上述各种获取用户社交关系的途径,要么就是因为隐私问题很难获取,要么就是虽然容易获取,但却都是隐性社交关系数据,很难推断出用户之间的显性社交关系。在Facebook和Twitter诞生之前,社会化应用(无论是电子邮件系统还是即时聊天系统)都过于封闭。用户只能和自己的好友进行交流,而无法了解到好友圈以外的世界,而且用户之间交流的内容都是非常私密的,大部分用户不会允许将它们公开来用作其他用途。

但以Facebook和Twitter为代表的新一代社交网络突破了这个瓶颈。它们允许用户创建一个公开的页面介绍自己,并且默认公开用户的好友列表(当然用户可以指定不将某些好友公开,但如果用户不指定,默认是公开的),而用户基于它们讨论的话题也很少涉及个人隐私,大都是讨论一些社会热点或分享一些图片、音乐、视频和笑话。

社交网站的另一个好处是自然地减轻了信息过载问题。在社交网站中,我们可以通过好友给自己过滤信息。比如,我们只关注那些和我们兴趣相似的好友,只阅读他们分享的信息,因此可以避免阅读很多和自己无关的信息。个性化推荐系统可以利用社交网站公开的用户社交网络和行为数据,辅助用户更好地完成信息过滤的任务,更好地找到和自己兴趣相似的好友,更快地找到自己感兴趣的内容。

1. 社会图谱和兴趣图谱
Facebook和Twitter作为社交网站中的两个代表,它们其实代表了不同的社交网络结构。在Facebook里,人们的好友一般都是自己在现实社会中认识的人,比如亲戚、同学、同事等,而且Facebook中的好友关系是需要双方确认的。在Twitter里,人们的好友往往都是现实中自己不认识的,而只是出于对对方言论的兴趣而建立好友关系,好友关系也是单向的关注关系。以Facebook为代表的社交网络称为社交图谱(social graph),而以Twitter为代表的社交网络称为兴趣图谱(interest graph)。

关于这两种社交网络的分类其实早在19世纪就被社会学家研究过了。19世纪,德国社会学家斐迪南·滕尼斯(Ferdinand Tönnies)认为社会群体分为两种,一种是通过人们之间的共同兴趣和信念形成的,他将这种社会群体称为Gemeinschaft,而Gemeinschaft这个词后来被翻译成英语就是community,即汉语中的社区。另一种社会群体则是由于人们之间的亲属关系,工作关系而形成的,他称之为Gesellschaft,英文翻译为society,即汉语中的“社会”。因此,斐迪南·滕尼斯说的Gemeinschaft就是兴趣图谱,而Gesellschaft就是社会图谱。

但是,每个社会化网站都不是单纯的社交图谱或者兴趣图谱。一般认为,Facebook中的绝大多数用户联系基于社交图谱,而Twitter中的绝大多数用户联系基于兴趣图谱。但是,在Twitter或者微博中,我们也会关注现实中的亲朋好友,在Facebook中我们也会和一部分好友有同样的兴趣。

6.2 社交网络数据简介

社交网络定义了用户之间的联系,因此可以用图定义社交网络。我们用图G(V,E,w)定义一个社交网络,其中V是顶点集合,每个顶点代表一个用户,E是边集合,如果用户va和vb有社交网络关系,那么就有一条边e(va,vb)连接这两个用户,而w(va,vb)定义了边的权重。业界有两种著名的社交网络。一种以Facebook为代表,它的朋友关系是需要双向确认的,因此在这种社交网络上可以用无向边连接有社交网络关系的用户。另一种以Twitter为代表,它的朋友关系是单向的,因此可以用有向边代表这种社交网络上的用户关系。

此外,对图G中的用户顶点u,定义out(u)为顶点u指向的顶点集合(如果套用微博中的术语,out(u)就是用户u关注的用户集合),定义in(u)为指向顶点u的顶点集合(也就是关注用户u的用户集合)。那么,在Facebook这种无向社交网络中显然有out(u)=in(u)。
一般来说,有3种不同的社交网络数据。

 双向确认的社交网络数据 在以Facebook和人人网为代表的社交网络中,用户A和B之间形成好友关系需要通过双方的确认。因此,这种社交网络一般可以通过无向图表示。
 单向关注的社交网络数据 在以Twitter和新浪微博为代表的社交网络中,用户A可以关注用户B而不需要得到用户B的允许,因此这种社交网络中的用户关系是单向的,可以通过有向图表示。
 基于社区的社交网络数据 还有一种社交网络数据,用户之间并没有明确的关系,但是这种数据包含了用户属于不同社区的数据。比如豆瓣小组,属于同一个小组可能代表了用户兴趣的相似性。或者在论文数据集中,同一篇文章的不同作者也存在着一定的社交关系。或者是在同一家公司工作的人,或是同一个学校毕业的人等。

社交网络数据中的长尾分布
和前面第2章提到的用户活跃度分布和物品流行度分布类似,社交网络中用户的入度(in degree)和出度(out degree)的分布也是满足长尾分布的。

本节利用了Slashdot的社交网络数据集统计了用户入度和出度的分布。Slashdot的社交网络类似于Twitter,是一个有向图结构。因此,用户的入度反映了用户的社会影响力。如图6-3所示,用户的入度近似长尾分布,这说明在一个社交网络中影响力大的用户总是占少数。

同样,图6-4展示了Slashdot社交网络中用户出度的分布,而出度代表了一个用户关注的用户数,该图说明在一个社交网络中,关注很多人的用户占少数,而绝大多数用户只关注很少的人。

6.3 基于社交网络的推荐

很多网站都利用Facebook的社交网络数据给用户提供社会化推荐。如图6-5所示,视频推荐网站Clicker利用用户在Facebook的好友信息给用户推荐好友喜欢的视频,并且用好友进行了推荐解释。如图6-6所示,亚马逊网利用用户在Facebook的好友信息给用户推荐好友喜欢的商品,同时也使用好友进行了推荐解释。

社会化推荐之所以受到很多网站的重视,是源于如下优点。
 好友推荐可以增加推荐的信任度 好友往往是用户最信任的。用户往往不一定信任计算机的智能,但会信任好朋友的推荐。同样是给用户推荐《天龙八部》,前面提到的基于物品的协同过滤算法会说是因为用户之前看过《射雕英雄传》,而好友推荐会说是因为用户有8个好友都非常喜欢《天龙八部》。对比这两种解释,第二种解释一般能让用户更加心动,从而购买或者观看《天龙八部》。
 社交网络可以解决冷启动问题 当一个新用户通过微博或者Facebook账号登录网站时,我们可以从社交网站中获取用户的好友列表,然后给用户推荐好友在网站上喜欢的物品。从而我们可以在没有用户行为记录时就给用户提供较高质量的推荐结果,部分解决了推荐系统的冷启动问题。
当然,社会化推荐也有一些缺点,其中最主要的就是很多时候并不一定能提高推荐算法的离线精度(准确率和召回率)。特别是在基于社交图谱数据的推荐系统中,因为用户的好友关系不是基于共同兴趣产生的,所以用户好友的兴趣往往和用户的兴趣并不一致。比如,我们和自己父母的兴趣往往就差别很大。不过,因为社会化推荐算法不一定能提供离线精度,而且包含社交网络数据和用户行为数据的数据集不太多,因此本章不准备通过离线实验证明社会化推荐的优势。

2010年,ACM推荐系统大会的一个讨论组CAMRa曾经举办过一个关于社交网络的推荐系统比赛。该比赛希望参赛者能够利用用户之间的好友关系给用户推荐电影,并且利用准确率相关的指标评测参赛者的推荐算法。对社会化推荐感兴趣的读者可以关注一下该会议的相关论文。

6.3.1 基于邻域的社会化推荐算法

如果给定一个社交网络和一份用户行为数据集。其中社交网络定义了用户之间的好友关系,而用户行为数据集定义了不同用户的历史行为和兴趣数据。那么我们想到的最简单算法是给用户推荐好友喜欢的物品集合。即用户u对物品i的兴趣pui可以通过如下公式计算。

其中out(u)是用户u的好友集合,如果用户v喜欢物品i,则rvi=1,否则rvi=0。不过,即使都是用户u的好友,不同的好友和用户u的熟悉程度和兴趣相似度也是不同的。因此,我们应该在推荐算法中考虑好友和用户的熟悉程度以及兴趣相似度:

这里,wuv 由两部分相似度构成,一部分是用户u和用户v的熟悉程度,另一部分是用户u和用户v的兴趣相似度。用户u和用户v的熟悉程度(familiarity)描述了用户u和用户v在现实社会中的熟悉程度。一般来说,用户更加相信自己熟悉的好友的推荐,因此我们需要考虑用户之间的熟悉度。熟悉度可以用用户之间的共同好友比例来度量。也就是说如果用户u和用户v很熟悉,那么一般来说他们应该有很多共同的好友。

除了熟悉程度,还需要考虑用户之间的兴趣相似度。我们都和父母很熟悉,但很多时候我们和父母的兴趣却不相似,因此也不会喜欢他们喜欢的物品。因此,在度量用户相似度时还需要考虑兴趣相似度(similarity),而兴趣相似度可以通过和UserCF类似的方法度量,即如果两个用户喜欢的物品集合重合度很高,两个用户的兴趣相似度很高。

其中N(u)是用户u喜欢的物品集合。

下面的代码实现社会化推荐的逻辑。在代码中,familiarity存储了每个用户最熟悉的K个好友和他们的熟悉程度,similarity存储了和每个用户兴趣最相关的K好友和他们的兴趣相似度。train记录了每个用户的行为记录,其中train[u]记录了用户u喜欢的物品列表。

def Recommend(uid, familiarity, similarity, train): rank = dict() interacted_items = train[uid] for fid,fw in familiarity[uid]: for item,pw in train[fid]: # if user has already know the item # do not recommend it if item in interacted_items: continue addToDict(rank, item, fw * pw) for vid,sw in similarity[uid]: for item,pw in train[vid]: if item in interacted_items: continue addToDict(rank, item, sw * pw) return rank

6.3.2 基于图的社会化推荐算法

前几章都提到了如何在推荐系统中使用图模型,比如用户物品二分图、用户-物品-标签图模型等。从前面几章的介绍可以看到,图模型的优点是可以将各种数据和关系都表示到图上去。在社交网站中存在两种关系,一种是用户对物品的兴趣关系,一种是用户之间的社交网络关系。本节主要讨论如何将这两种关系建立到图模型中,从而实现对用户的个性化推荐。

用户的社交网络可以表示为社交网络图,用户对物品的行为可以表示为用户物品二分图,而这两种图可以结合成一个图。图6-7是一个结合了社交网络图和用户物品二分图的例子。该图上有用户顶点(圆圈)和物品顶点(方块)两种顶点。如果用户u对物品i产生过行为,那么两个节点之间就有边相连。比如该图中用户A对物品a、e产生过行为。如果用户u和用户v是好友,那么也会有一条边连接这两个用户,比如该图中用户A就和用户B、D是好友。

在定义完图中的顶点和边后,需要定义边的权重。其中用户和用户之间边的权重可以定义为用户之间相似度的α倍(包括熟悉程度和兴趣相似度),而用户和物品之间的权重可以定义为用户对物品喜欢程度的 β 倍。α 和 β 需要根据应用的需求确定。如果我们希望用户好友的行为对推荐结果产生比较大的影响,那么就可以选择比较大的α 。相反,如果我们希望用户的历史行为对推荐结果产生比较大的影响,就可以选择比较大的 β 。

在定义完图中的顶点、边和边的权重后,我们就可以利用前面几章提到的PersonalRank图排序算法给每个用户生成推荐结果。

在社交网络中,除了常见的、用户和用户之间直接的社交网络关系,还有一种关系,即两个用户属于同一个社群。Quan Yuan等详细研究了这两种社交网络关系,他们将第一种社交网络关系称为friendship,而将第二种社交网络关系称为membership。如果要在前面提到的基于邻域的社会化推荐算法中考虑membership的社交关系,可以利用两个用户加入的社区重合度计算用户相似度,然后给用户推荐和他相似的用户喜欢的物品。但是,如果利用图模型,我们就很容易同时对friendship和membership建模。如图6-8所示,可以加入一种节点表示社群(最左边一列的节点),而如果用户属于某一社群,图中就有一条边联系用户对应的节点和社群对应的节点。在建立完图模型后,我们就可以通过前面提到的基于图的推荐算法(比如PersonalRank)给用户推荐物品。

6.3.3 实际系统中的社会化推荐算法

6.3.1节提出的基于邻域的社会化推荐算法看起来非常简单,但在实际系统中却是很难操作的,这主要是因为该算法需要拿到用户所有好友的历史行为数据,而这一操作在实际系统中是比较重的操作。因为大型网站中用户数目非常庞大,用户的历史行为记录也非常庞大,所以不太可能将用户的所有行为都缓存在内存中,只能在数据库前做一个热数据的缓存。而如果我们需要比较实时的数据,这个缓存中的数据就要比较频繁地更新,因而避免不了数据库的查询。我们知道,数据库查询一般是很慢的,特别是针对行为很多的用户更是如此。所以,如果一个算法再给一个用户做推荐时,需要他所有好友的历史行为数据,这在实际环境中是比较困难的。

如果回想一下ItemCF可以发现,ItemCF算法只需要当前用户的历史行为数据和物品的相关表就可以生成推荐结果。对于物品数不是特别多的网站,可以很容易地将物品相关表缓存在内存中,因此查询相关物品的代价很低,所以ItemCF算法很容易在实际环境下实现。

当然,我们可以从几个方面改进基于邻域的社会化推荐算法,让它能够具有比较快的响应时间。改进的方向有两种,一种是治标不治本的方法。简单地说,就是可以做两处截断。第一处截断就是在拿用户好友集合时并不拿出用户所有的好友,而是只拿出和用户相似度最高的N个好友。这里N可以取一个比较小的数。从而给该用户做推荐时可以只查询N次用户历史行为接口。此外,在查询每个用户的历史行为时,可以只返回用户最近1个月的行为,这样就可以在用户行为缓存中缓存更多用户的历史行为数据,从而加快查询用户历史行为接口的速度。此外,还可以牺牲一定的实时性,降低缓存中用户行为列表过期的频率。

而第二种解决方案需要重新设计数据库。通过前面的分析可以发现,社会化推荐中关键的操作就是拿到用户所有好友的行为数据,然后通过一定的聚合展示给用户。如果对照一下微博,我们就可以发现微博中每个用户都有一个信息墙,这个墙上实时展示着用户关注的所有好友的动态。因此,如果能够实现这个信息墙,就能够实现社会化推荐算法。Twitter的解决方案是给每个用户维护一个消息队列(message queue),当一个用户发表一条微博时,所有关注他的用户的消息队列中都会加入这条微博。这个实现的优点是用户获取信息墙时可以直接读消息队列,所以终端用户的读操作很快。不过这个实现也有缺点,当一个用户发表了一条微博,就会触发很多写操作,因为要更新所有关注他的用户的消息队列,特别是当一个人被很多人关注时,就会有大量的写操作。Twitter通过大量的缓存解决了这一问题。具体的细节可以参考InfoQ对Twitter架构的介绍。

如果将Twitter的架构搬到社会化推荐系统中,我们就可以按照如下方式设计系统:
 首先,为每个用户维护一个消息队列,用于存储他的推荐列表;
 当一个用户喜欢一个物品时,就将(物品ID、用户ID和时间)这条记录写入关注该用户的推荐列表消息队列中;
 当用户访问推荐系统时,读出他的推荐列表消息队列,对于这个消息队列中的每个物品,重新计算该物品的权重。计算权重时需要考虑物品在队列中出现的次数,物品对应的用户和当前用户的熟悉程度、物品的时间戳。同时,计算出每个物品被哪些好友喜欢过,用这些好友作为物品的推荐解释。

6.3.4 社会化推荐系统和协同过滤推荐系统

关于社会化推荐系统的离线评测可以参考Georg Groh和Christian Ehmig的工作成果。不过社会化推荐系统的效果往往很难通过离线实验评测,因为社会化推荐的优势不在于增加预测准确度,而是在于通过用户的好友增加用户对推荐结果的信任度,从而让用户单击那些很冷门的推荐结果。此外,很多社交网站(特别是基于社交图谱的社交网站)中具有好友关系的用户并不一定有相似的兴趣。因此,利用好友关系有时并不能增加离线评测的准确率和召回率。因此,很多研究人员利用用户调查和在线实验的方式评测社会化推荐系统。

对社会化推荐系统进行用户调查的代表性工作成果是Rashmi Sinha和Kirsten Swearingen对比社会化推荐系统和协同过滤推荐系统的论文。这一节将简单介绍一下他们的工作方法和结果。一共有19个人参加了实验,他们都来自加州大学伯克利分校,年龄为20~35岁,其中6名男性13名女性,9名实验人员从事互联网技术相关的工作,而剩下10位从事的工作和互联网技术无关。Sinha首先让他们进行第一项任务:评测3个真实的电影推荐系统(Amazon、MovieCritic、Reel.co)和3个真实的图书推荐系统(Amazon.com、 RatingZone、 Sleeper)。在评测每一个真实推荐系统时,参试者需要按照如下顺序完成实验。
 利用一个虚假的邮箱注册推荐系统,从而保证这些新账号没有任何历史行为。
 利用新注册的账号给电影、图书进行评分。
 查看推荐列表。
 如果一开始的推荐列表中没有符合用户兴趣的物品,用户将被要求从该网站中搜索到至少一个令他们感兴趣的物品,如果实在找不到,可以停止搜索。
 回答调查问卷。

在完成真实推荐系统的评测任务后,参试者还需要评测社会化推荐系统。实验步骤如下。
 每个参试者需要提供3个他们认为了解其兴趣的好友的邮箱。
 实验人员给每个好友发邮件,要求他们给参试者推荐3本书和3部电影,并且要求这些书和电影不能是参试者之前和他们讨论过的,即不能是参试者之前告诉他们并表示喜欢的物品。
 参试者将会看到好友推荐的书和电影的缩略图以及一段简单的介绍。
 回答调查问卷。

作者通过分析用户实验的过程和最终回答的调查问卷证明,社会化推荐系统推荐结果的用户满意度明显高于主要基于协同过滤算法的几个真实推荐系统。具体的数据可以参考作者的论文。这里仅引用亚马逊网的图书推荐和好友推荐的结果对比。60%的参试者认为亚马逊网的图书推荐是好的推荐,32%的参试者认为亚马逊网的图书推荐是有用的推荐。与之形成对比的是,90%的参试者认为好友的图书推荐是好的推荐,78%的参试者认为好友的图书推荐是有用的推荐。从这个数据可以看出,好友推荐结果的用户满意度明显高于基于协同过滤的亚马逊推荐系统。

不过作者也承认实验存在一些问题。其中两个主要的问题如下:
 不是双盲实验,参试者知道什么结果来自基于协同过滤的推荐系统,什么结果来自好友的推荐;
 参试者在实验室中的行为可能和他们平时的真实行为不同。此外,上述实验结果仅仅来自对19个用户的调查,样本过小。因此,对于上面的结果不要过分解读,还是应该在自己的系统中进行AB测试,得到最为客观的答案。

6.3.5 信息流推荐

信息流推荐是社会化推荐领域的新兴话题,它主要针对Twitter和Facebook这两种社交网站。在这两种社交网站中,每个用户都有一个信息墙(如图6-9、图6-10所示),展示了用户好友最近的言论。这个信息墙无疑已经是个性化的,但是里面还是夹杂了很多垃圾信息。这主要是因为我们并不关心我们关注的好友的所有言论,而只关心他们的言论中和自己相关的部分。虽然我们在选择关注时已经考虑了关注对象和自己兴趣的相似度,但显然我们无法找到和自己兴趣完全一致的人。因此,信息流的个性化推荐要解决的问题就是如何进一步帮助用户从信息墙上挑选有用的信息。



目前最流行的信息流推荐算法是Facebook的EdgeRank,该算法综合考虑了信息流中每个会话的时间、长度与用户兴趣的相似度。EdgeRank算法比较神秘,没有相关的论文,不过TechCrunch曾经公开过它的主要思想。Facebook将其他用户对当前用户信息流中的会话产生过行为的行为称为edge,而一条会话的权重定义为:

其中:
 ue 指产生行为的用户和当前用户的相似度,这里的相似度主要是在社交网络图中的熟悉度;
 we 指行为的权重,这里的行为包括创建、评论、like(喜欢)、打标签等,不同的行为有不同的权重
 de 指时间衰减参数,越早的行为对权重的影响越低。
从上面的描述中可以得出如下结论:如果一个会话被你熟悉的好友最近产生过重要的行为,它就会有比较高的权重。
不过,EdgeRank算法的个性化因素仅仅是好友的熟悉度,它并没有考虑帖子内容和用户兴趣的相似度。所以EdgeRank仅仅考虑了“我”周围用户的社会化兴趣,而没有重视“我”个人的个性化兴趣。为此,GroupLens的研究人员Jilin Chen深入研究了信息流推荐中社会兴趣和个性化兴趣之间的关系。他们的排名算法考虑了如下因素。

 会话的长度 越长的会话包括越多的信息。
 话题相关性 度量了会话中主要话题和用户兴趣之间的相关性。这里Jilin Chen用了简单的TF-IDF建立用户历史兴趣的关键词向量和当前会话的关键词向量,然后用这两个向量的相似度度量话题相关性。

 用户熟悉程度 主要度量了会话中涉及的用户(比如会话的创建者、讨论者等)和当前用户的熟悉程度。对于如何度量用户的熟悉程度下一节将详细介绍。计算熟悉度的主要思想是考虑用户之间的共同好友数等。

为了验证算法的性能,Jilin Chen同样也设计了一个用户调查。首先,他通过问卷将用户分成两种类型。第一种类型的用户使用Twitter的目的是寻找信息,也就是说他们将Twitter看做一种信息源和新闻媒体。而第二种用户使用Twitter的目的是了解好友的最新动态以及和好朋友聊天。然后,他让参试者对如下5种算法的推荐结果给出1~5分的评分,其中1分表示不喜欢,5分表示最喜欢。
 Random 给用户随机推荐会话。
 Length 给用户推荐比较长的会话。
 Topic 给用户推荐和他兴趣相关的会话。
 Tie 给用户推荐和他熟悉的好友参与的会话。
 Topic+Tie 综合考虑会话和用户的兴趣相关度以及用户好友参与会话的程度。
通过收集用户反馈,Jilin Chen发现(如图6-11所示),对于所有用户不同算法的平均得分是:

Topic+Tie > Tie > Topic > Length > Random
而对于主要目的是寻找信息的用户,不同算法的得分是:
Topic+Tie ≥ Topic > Length > Tie > Random
对于主要目的是交友的用户,不同算法的得分是:
Topic+Tie > Tie > Topic > Length > Random

实验结果说明,综合考虑用户的社会兴趣和个人兴趣对于提高用户满意度是有帮助的。因此,当我们在一个社交网站中设计推荐系统时,可以综合考虑这两个因素,找到最合适的融合参数来融合用户的社会兴趣和个人兴趣,从而给用户提供最令他们满意的推荐结果。

6.4 给用户推荐好友

好友关系是社会化网站的重要组成部分,如果用户的好友很稀少,就不能体验到社会化的好处。因此好友推荐是社会化网站的重要应用之一。好友推荐系统的目的是根据用户现有的好友、用户的行为记录给用户推荐新的好友,从而增加整个社交网络的稠密程度和社交网站用户的活跃度。图6-12、图6-13和图 6-14分别展示了3个著名社交网站Twitter、LinkedIn和Facebook的好友推荐界面。由此可以说明,好友推荐模块已经成为社交网站的标准配置之一。


好友推荐算法在社交网络上被称为链接预测(link prediction)。关于链接预测算法研究的代表文章是Jon Kleinberg的“Link Prediction in Social Network”。该文对各种用户好友关系的预测方法进行了系统地研究和对比。本章我们将介绍其中一些比较直观和简单的算法。

6.4.1 基于内容的匹配

我们可以给用户推荐和他们有相似内容属性的用户作为好友(如图6-15所示)。下面给出了常用的内容属性。
 用户人口统计学属性,包括年龄、性别、职业、毕业学校和工作单位等。
 用户的兴趣,包括用户喜欢的物品和发布过的言论等。
 用户的位置信息,包括用户的住址、IP地址和邮编等。


利用内容信息计算用户的相似度和我们前面讨论的利用内容信息计算物品的相似度类似。

6.4.2 基于共同兴趣的好友推荐

在Twitter和微博为代表的以兴趣图谱为主的社交网络中,用户往往不关心对于一个人是否在现实社会中认识,而只关心是否和他们有共同的兴趣爱好。因此,在这种网站中需要给用户推荐和他有共同兴趣的其他用户作为好友。

我们在第3章介绍基于用户的协同过滤算法(UserCF)时已经详细介绍了如何计算用户之间的兴趣相似度,其主要思想就是如果用户喜欢相同的物品,则说明他们具有相似的兴趣。在新浪微博中,可以将微博看做物品,如果两个用户曾经评论或者转发同样的微博,说明他们具有相似的兴趣。在Facebook中,因为有大量用户Like(喜欢)的数据,所以更容易用UserCF算法计算用户的兴趣相似度。关于这方面的算法可以参考第3章。此外,也可以根据用户在社交网络中的发言提取用户的兴趣标签,来计算用户的兴趣相似度。关于如何分析用户发言的内容、提取文本的关键词、计算文本的相似度,可以参考第4章。

6.4.3 基于社交网络图的好友推荐

在社交网站中,我们会获得用户之间现有的社交网络图,然后可以基于现有的社交网络给用户推荐新的好友,比如可以给用户推荐好友的好友。

最简单的好友推荐算法是给用户推荐好友的好友。在人人网,我们经常可以通过这个功能找到很多自己的老同学。在刚开始用人人网时,我们只能加入有限的好友,因为我们记住的好友有限。虽然我们只能记住几个同学,但那些同学又能记住几个不同的同学,在这种情况下,我们可以通过朋友的朋友找到更多我们认识的人。

基于好友的好友推荐算法可以用来给用户推荐他们在现实社会中互相熟悉,而在当前社交网络中没有联系的其他用户。下面将介绍3种基于社交网络的好友推荐算法。

对于用户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}

Wout(u,v) 公式中out(u)是在社交网络图中用户u指向的其他好友的集合。我们也可以定义in(u)是在社交网络图中指向用户u的用户的集合。在无向社交网络图中,out(u)和in(u)是相同的集合。但在微博这种有向社交网络中,这两个集合就不同了,因此也可以通过in(u)定义另一种相似度:

def FriendSuggestion(user, G, GT): suggestions = dict() for fid in GT[user]: for ffid in G[fid]: if ffid in friends: continue if ffid not in suggestions: suggestions[ffid] = 0 suggestions[ffid] += 1 suggestions = {x: y / math.sqrt(len(GT[user]) * len(GT[x]) for x,y in suggestions}

这两种相似度的定义有着不同的含义,我们用微博中的关注来解释这两种相似度。如果用户u关注了用户v,那么Wv就属于out(u),而u就属于in(v)。因此,Wout(u,v)越大表示用户u和v关注的用户集合重合度越大,而Win(u,v) 越大表示关注用户u和关注用户v的用户的集合重合度越大。

前面两种相似度都是对称的,也就是 Win(u,v)=Win(v.u),Wout(u,v) = Wout(v,u) 。同时,我们还可以定义第三种有向的相似度:


这个相似度的含义是用户u关注的用户中,有多大比例也关注了用户v。但是,这个相似度有一个缺点,就是在该相似度的定义下所有人都和名人有很大的相似度。这是因为这个相似度在分母的部分没有考虑|in(v)|的大小。因此,我们可以用如下公式改进上面的相似度:

def FriendSuggestion(user, G, GT): suggestions = dict() for fid in GT[user]: for ffid in G[fid]: if ffid in friends: continue if ffid not in suggestions: suggestions[ffid] = 0 suggestions[ffid] += 1 suggestions = {x: y / math.sqrt(len(GT[user]) * len(GT[x]) for x,y in suggestions}

前面讨论的这些相似度都是基于一些简单计算公式给出的。这些相似度的计算无论时间复杂度还是空间复杂度都不是很高,非常适合在线应用使用。

离线实验
本节希望通过一些离线实验评测本节提出的几种相似度,评测哪种相似度能更好地预测用户之间的好友关系。互联网上有很多社交网络数据集,其中比较著名的是斯坦福大学的大规模网络数据集①。该数据集包含很多链接结构数据集,包括社交网络数据集、互联网超级链接数据集、道路交通网络、用户行为网络、论文引用网络等。这里,我们使用该集合中提供的Slashdot社交网络数据集。该数据集是一个有向图,包含82 168个顶点和948 464条边。

为了测试不同好友推荐算法的性能,本节将数据集按照9:1分成训练集和测试集。然后,给定用户u,我们会利用训练集中的社交网络给用户生成长度为10的好友推荐列表R(u),其中R(u)中的用户不包含用户u在训练集中的好友。表6-1展示了不同好友推荐算法的召回率和准确率。


从表中结果可以看到,不同数据集上不同算法的性能并不相同。在Slashdot数据集上 win 取得了最好的性能,而在Epinion数据集上 wout,in 取得了最好的性能。所以,在实际系统中我们需要在自己的数据集上对比不同的算法,找到最适合自己数据集的好友推荐算法

6.4.4 基于用户调查的好友推荐算法对比

对于前面3节提出的几种不同的好友推荐算法,上一节提到的GroupLen的Jilin Chen也进行了研究。他通过用户调查对比了不同算法的用户满意度,其中算法(这里我们使用了不同的命名)如下。

 InterestBased 给用户推荐和他兴趣相似的其他用户作为好友。
 SocialBased 基于社交网络给用户推荐他好友的好友作为好友。
 Interest+Social 将InterestBased算法推荐的好友和SocialBased算法推荐的好友按照一定
权重融合。
 SONA SONA是IBM内部的推荐算法,该算法利用大量用户信息建立了IBM员工之间的社交网络。这些信息包括所在的部门、共同发表的文章、共同写的Wiki、IBM的内部社交网络信息、共同合作的专利等。

然后,Jilin Chen在IBM数据的基础上用上述算法建立4种不同的好友推荐系统,然后给每个参加测试的用户提供12个推荐结果,其中每个算法提供了3个推荐结果。也就是说,参试者并不知道每个结果来自哪个算法。然后,Jilin Chen让参试者对每个推荐结果回答以下4个问题。

 你是否认识这个人?
 你是否觉得这是一个好的推荐结果?
 你是否觉得推荐理由能够帮助你决策?
 看到这个推荐结果后你决定进行以下哪种行为(单选):
 主动和这个人交朋友;
 希望别人能够向这个人介绍自己;
 什么也不干。

调查结果如表6-2所示。首先,从结果可以发现,对推荐结果的新颖性不同算法的排名如下

SONA因为用到了部门信息、共同写论文和发表专利的信息,所以推荐的好友大部分都是用户认识的,因此新颖度不高。其次,结果表明如果用户认识推荐结果中的人,那么绝大部分用户都会觉得这是一个好的推荐结果,而如果用户不认识推荐结果中的人,绝大多数人都觉得推荐结果不好。从用户认为推荐结果是否好的比例看,不同算法的排名如下:
SONA > SocialBased > Interest+Social > InterestBased
SONA排名不高是因为它综合了更多的信息。

6.5 扩展阅读

社交网络分析的研究已经有很悠久的历史了。其中关于社交网络最让人耳熟能详的结论就是六度原理。六度原理讲的是社会中任意两个人都可以通过不超过6个人的路径相互认识,如果转化为图的术语,就是社交网络图的直径为6。不过喜欢刨根问底的读者一定好奇六度原理的正确性。六度原理在均匀随机图上已经得到了完美证明,对此感兴趣的读者可以参考Random Graph一书。很多对社交网络的研究都是基于随机图理论的,因此深入研究社交网络必须掌握随机图理论的相关知识。

社交网络研究中有两个最著名的问题。第一个是如何度量人的重要性,也就是社交网络顶点的中心度(centrality),第二个问题是如何度量社交网络中人和人之间的关系,也就是链接预测。这两个问题的研究都有着深刻的实际意义,因此得到了业界和学术界的广泛关注。对这两个问题感兴趣的读者可以参考社交网络分析方面的书。

对于基于社交网络的推荐算法,因为数据集的限制,最早的研究都是基于Epinion的用户信任网络的。Ma Hao在Epinion数据集上提出了很多基于矩阵分解的社会化推荐算法用来解决评分预测问题,其主要思想是在矩阵分解模型中加入正则化项,让具有社交关系的用户的隐语义向量具有比较高的相似度。

ACM推荐系统大会在2010年曾经举办过一个社会化推荐比赛,该比赛将社交网络看做一种上下文,希望参赛者能够利用社交网络信息提高推荐系统的性能。关注社交化推荐的读者可以关注一下该比赛最后发出的论文集。

推荐系统实践读书笔记-06利用社交网络数据相关推荐

  1. 推荐系统实践读书笔记-04利用用户标签数据

    推荐系统实践读书笔记-04利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品,这种联系需要依赖不同的媒介.GroupLens在一篇文章中表示目前流行的推荐系统基本上通过3种方式联系用户兴趣和物品. ...

  2. 推荐系统实践读书笔记-02利用用户行为数据

    推荐系统实践读书笔记-02利用用户行为数据 为了让推荐结果符合用户口味,我们需要深入了解用户.如何才能了解一个人呢?<论语·公冶长>中说"听其言,观其行",也就是说可以 ...

  3. 推荐系统实践读书笔记-05利用上下文信息

    推荐系统实践读书笔记-05利用上下文信息 本章之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context ...

  4. 推荐系统实践读书笔记-01好的推荐系统

    推荐系统实践读书笔记-01好的推荐系统 在研究如何设计推荐系统前,了解什么是好的推荐系统至关重要.只有了解了优秀推荐系统的特征,我们才能在设计推荐系统时根据实际情况进行取舍.本章分3个步骤来回答这个问 ...

  5. 推荐系统实践读书笔记-08评分预测问题

    推荐系统实践读书笔记-08评分预测问题 本书到目前为止都是在讨论TopN推荐,即给定一个用户,如何给他生成一个长度为N的推荐列表,使该推荐列表能够尽量满足用户的兴趣和需求.本书之所以如此重视TopN推 ...

  6. 推荐系统实践读书笔记

    最近大概复习了一下这本书,了解了较早的推荐系统的一些方法,记录如下,以便大家对本书内容有个快速地了解.略去了第一张,详细的代码和细节可以参考其他博客.需要关注的地方直接标出了页码. 书里面的代码不是很 ...

  7. python基础学习[python编程从入门到实践读书笔记(连载五)]:数据可视化项目第16章

    文章目录 下载数据 制作全球地震散点图:JSON格式 end 几个实验结果: 每日最高气温: 地震图绘制: 下载数据 CSV文件格式 在文本文件中存储数据,一个简单方式是将数据作为一系列以逗号分隔的值 ...

  8. python基础学习[python编程从入门到实践读书笔记(连载六)]:数据可视化项目第17章

    文章目录 使用API end 项目结果: 使用plotly可视化github最受欢迎的python仓库: 修改后的可视化图表: 使用API 编写独立的程序,实现对获取的数据可视化.我们使用Web AP ...

  9. python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章

    文章目录 matplotlib初学 基础绘图用法 随机漫步 使用Plotly模拟掷骰子 matplotlib初学 基础绘图用法 import matplotlib.pyplot as pltsquar ...

最新文章

  1. RxJava Timer:代替handler
  2. go get 命令提示没有权限问题解决
  3. 【TensorFlow-windows】MobileNet理论概览与实现
  4. python 英语培训_英语学习与Python编程语言学习相辅相成(三十一)
  5. 国际顶会加持,算法大赛等你共探技术新可能
  6. Html 点透镂空遮罩,swift 实现遮罩部分区域“挖洞”效果和点击事件穿透
  7. 用Python实现应用Last-Modified和ETag避免下载重复内容
  8. Spring@Import注解的三种用法
  9. 鱼哥,我怕蛇,可以搞Python么?
  10. java layer调用native层的android_media_AudioTrack_get_min_buff_size()确定audio track buffer的min size...
  11. JVM学习笔记(三)------内存管理和垃圾回收【转】
  12. Java--Java版本和JDK版本
  13. ad 原理图差分线_Altium Designer原理图放置差分信号
  14. 面试经历(纯属个人经历,仅供观看参考)
  15. Boostnote:适合程序员的笔记软件
  16. macOS 13 如何更新?macOS Ventura抢先更新
  17. 程序员创业:高智商的程序员为什么创业却屡屡失败?
  18. 关于 promise链式调用与中止
  19. SQL Server辅助插件——SQL Prompt
  20. 《再别康桥》(徐志摩)

热门文章

  1. 《同桌的你》之BT版
  2. 学计算机能用到的礼物,考上大学送什么礼物好,盘点10款有趣的
  3. 超级电容TL431方案全讲解
  4. shell脚本之sed开发
  5. python机器人库_机器人之实战深度学习(上)OpenCV库
  6. 无法确认设备和计算机之间的连接打印机,我无法从计算机上通过USB 进行打印...
  7. 北京第9届.NET俱乐部参与有感
  8. Warning: The VM will try to fix the stack guard now.It's highly recommended that you fix the library
  9. python阴阳鱼绘制(使用turtle)
  10. Patching OIM 11.1.1.5.0 to 11.1.1.5.3