今年抖音非常火爆和流行,我们在刷抖音的时候,经常会发现给我们刷到自己微信或者是抖音好友喜欢的小视频,这里很多人都就会很好奇,抖音怎么知道这些人是我的好友,甚至知道我和好友的兴趣就一样呢,这就有了基于社交网络数据的推荐算法。ps:抖音的推荐是多种算法实现的,基于社交网络数据应该只是其中的一个分支。

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

  • 原理

  如果给定一个社交网络和一份用户行为数据集。其中社交网络算法是给用户推荐好友喜欢的物品集合。即用户 u u u 对物品 i i i 的兴趣 p u i p_{ui} pui​ 可以通过如下公式计算:
p u i = ∑ v ∈ o u t ( u ) r v i {p_{ui}} = \sum\limits_{v \in out(u)} {r_{vi}} pui​=v∈out(u)∑​rvi​
  其中 o u t ( u ) out(u) out(u) 是用户 u u u 的好友集合,如果用户 v v v 喜欢物品 i i i,则 r v i = 1 r_{vi}=1 rvi​=1,否则 r v i = 0 r_{vi}=0 rvi​=0。不过,即使都是用户 u u u 的好友,不同的好友和用户 u u u 的熟悉程度和兴趣相似度也是不同的。因此,我们应该在推荐算法中考虑好友和用户的熟悉程度以及兴趣相似度:
p u i = ∑ v ∈ o u t ( u ) w u v r v i {p_{ui}} = \sum\limits_{v \in out(u)} {w_{uv}}{r_{vi}} pui​=v∈out(u)∑​wuv​rvi​
  这里, u v w u_{vw} uvw​ 由两部分相似度构成,一部分是用户 u u u 和用户 v v v 的熟悉程度,另一部分是用户 u u u 和用户 v v v 的兴趣相似度,我们分别用如下公式表示:
f a m i l i a r i t y ( u , v ) = ∣ o u t ( u ) ∩ o u t ( v ) ∣ ∣ o u t ( u ) ∪ o u t ( v ) ∣ {familiarity(u, v)} ={\frac{|out(u) \cap out(v)|}{|out(u) \cup out(v)|}} familiarity(u,v)=∣out(u)∪out(v)∣∣out(u)∩out(v)∣​
s i m i l i a r i t y ( u , v ) = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∪ N ( v ) ∣ {similiarity(u, v)} ={\frac{|N(u) \cap N(v)|}{|N(u) \cup N(v)|}} similiarity(u,v)=∣N(u)∪N(v)∣∣N(u)∩N(v)∣​
  其中 o u t ( u ) , o u t ( v ) out(u),out(v) out(u),out(v) 代表用户 u u u, v v v 的好友集合, N ( u ) , N ( v ) N(u), N(v) N(u),N(v) 代表用户 u u u, v v v 的共同兴趣集合。
  

  • 实例分析

  • 数据处理
    下面两个表格分别为自己编的用户好友数据与用户兴趣数据:

用户 好友
A B,C,D
B A,C
C A,B,D
D A,C,E
E D
用户 兴趣
A 篮球,乒乓球
B 羽毛球,篮球,足球
C 乒乓球,桌球,足球
D 足球,羽毛球,篮球
E 乒乓球,桌球,篮球,棒球

  规范数据集,具体需要什么样的数据,具体情况具体分析:

 def load_data(friend_file, interest_file):  # 规范数据集fri_f = open(friend_file, "r", encoding="utf-8")int_f = open(interest_file, "r", encoding="utf-8")friends_data = dict()for line in fri_f:data = line.strip().split("\t")friends_data[data[0]] = data[1].split(",")interests_data = dict()for line in int_f:data = line.strip().split("\t")interests_data[data[0]] = data[1].split(",")fri_f.close()int_f.close()print("好友数据集: ", friends_data)print("兴趣数据集: ", interests_data)return friends_data, interests_data
 好友数据集:  {'A': ['B', 'C', 'D'], 'B': ['A', 'C'], 'C': ['A', 'B', 'D'], 'D': ['A', 'C', 'E'], 'E': ['D']}兴趣数据集:  {'A': ['篮球', '乒乓球'], 'B': ['羽毛球', '篮球', '足球'], 'C': ['乒乓球', '桌球', '足球'], 'D': ['足球', '羽毛球', '篮球'], 'E': ['乒乓球', '桌球', '篮球', '棒球']}
  • 构建倒排列表
    由推荐系统实践(一)----基于用户的协同过滤算法(UserCF),我们知道计算用户相似度,必须构建倒排列表,方法和前面博文相同。
 def user_friend_interest(friends_data, interests_data):  # 构建倒排列表friends_dic = dict()for user, friends in friends_data.items():for friend in friends:if friend not in friends_dic:friends_dic[friend] = set()friends_dic[friend].add(user)interests_dic = dict()for user, interests in interests_data.items():for interest in interests:if interest not in interests_dic:interests_dic[interest] = set()interests_dic[interest].add(user)print("好友数据倒排列表: ", friends_dic)print("兴趣数据倒排列表: ", interests_dic)return friends_dic, interests_dic

  获得下面倒排列表:

 好友数据倒排列表:  {'B': {'C', 'A'}, 'C': {'D', 'B', 'A'}, 'D': {'E', 'C', 'A'}, 'A': {'B', 'C', 'D'}, 'E': {'D'}}兴趣数据倒排列表:  {'篮球': {'D', 'E', 'B', 'A'}, '乒乓球': {'E', 'C', 'A'}, '羽毛球': {'B', 'D'}, '足球': {'B', 'C', 'D'}, '桌球': {'E', 'C'}, '棒球': {'E'}}
  • 相似度计算
    有了倒排列表我们就可以计算用户的好友熟悉度与用户兴趣相似度,两者计算方法相同,所以我们这里就只写一个了:
 def similarity(data):    # 好友熟悉度C = dict()N = dict()for user, friends in data.items():for u in friends:N.setdefault(u, 0)N[u] += 1  # 计算每个用户好友数量for v in friends:if u == v:continueC.setdefault(u, {})C[u].setdefault(v, 0)C[u][v] += 1   # 计算共同好友数量W = dict()for u, related_users in C.items():for v, cuv in related_users.items():W.setdefault(u, {})W[u].setdefault(v, 0)W[u][v] = cuv / math.sqrt(N[u] * N[v])return W

  最终获取到的用户熟悉度和兴趣相似度为:

 用户-好友熟悉度:  {'C': {'A': 0.6666666666666666, 'E': 0.5773502691896258, 'B': 0.4082482904638631, 'D': 0.3333333333333333}, 'A': {'C': 0.6666666666666666, 'B': 0.4082482904638631, 'D': 0.3333333333333333, 'E': 0.5773502691896258}, 'B': {'D': 0.8164965809277261, 'A': 0.4082482904638631, 'C': 0.4082482904638631}, 'D': {'B': 0.8164965809277261, 'A': 0.3333333333333333, 'C': 0.3333333333333333}, 'E': {'C': 0.5773502691896258, 'A': 0.5773502691896258}}用户-兴趣相似度:  {'B': {'D': 1.0, 'E': 0.2886751345948129, 'A': 0.4082482904638631, 'C': 0.3333333333333333}, 'D': {'B': 1.0, 'E': 0.2886751345948129, 'A': 0.4082482904638631, 'C': 0.3333333333333333}, 'E': {'B': 0.2886751345948129, 'D': 0.2886751345948129, 'A': 0.7071067811865475, 'C': 0.5773502691896258}, 'A': {'B': 0.4082482904638631, 'D': 0.4082482904638631, 'E': 0.7071067811865475, 'C': 0.4082482904638631}, 'C': {'E': 0.5773502691896258, 'A': 0.4082482904638631, 'B': 0.3333333333333333, 'D': 0.3333333333333333}}
  • 推荐
    由上面的公式,可以利用python实现如下逻辑:
 def Recommend(user, familiarity, similarity, train):   # 假设对每个物品的喜欢程度都为1pw = 1rank = dict()interacted_items = train[user]  # 获取user感兴趣的物品rank = dict()for fid, fw in familiarity[user].items():for item in train[fid]:if item in interacted_items:continuerank.setdefault(item, 0)rank[item] = fw * pwfor vid, sw in similarity[user].items():for item in train[vid]:if item in interacted_items:continuerank.setdefault(item, 0)rank[item] = sw * pwrank = sorted(rank.items(),key = lambda x:x[1],reverse = True)   # 按兴趣度排序return rank

  最终我们对用户 A A A 进行推荐,获得下面的排序列表:

 为用户A推荐兴趣列表:  [('棒球', 0.7071067811865475), ('桌球', 0.4082482904638631), ('足球', 0.4082482904638631), ('羽毛球', 0.4082482904638631)]
  • 代码分析
    基于邻域社会化推荐算法

推荐系统实践(七)----基于邻域的社会化推荐算法相关推荐

  1. 推荐系统实践--基于邻域的社会化推荐算法

    本文链接:https://blog.csdn.net/keyue123/article/details/87370575   今年抖音非常火爆和流行,我们在刷抖音的时候,经常会发现给我们刷到自己微信或 ...

  2. 推荐系统实践(二)----基于物品的协同过滤算法(ItemCF)

      上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法.基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊.Netflix.Hulu.YouTub ...

  3. 推荐系统实践(一)----基于用户的协同过滤算法(UserCF)

      随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代.在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情,这 ...

  4. 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法

    概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...

  5. (附源码)ssm+mysql+基于ssm协同过滤推荐算法的电影院购票系统 毕业设计131124

    基于ssm协同过滤推荐算法的电影院购票系统 摘 要 随着信息技术的飞速发展以及Internet的迅速普及,以Web2.0为代表的互联网技术使得网络数据呈爆炸式增长,越来越多的信息和服务充斥着网络.人们 ...

  6. 基于机器学习的个性化推荐算法的研究

    基于 机器学习 的个性化推荐算法的研究 摘要: 如今互联网发展 十分迅速,每天产生的数据量一直在增加,传统的搜索引擎已经不能够适用当前的需求,推荐系统已经成为互联网时代的新宠儿.它已经发展成为一门跨学 ...

  7. 基于矩阵分解的推荐算法,简单入门

    摘自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞 ...

  8. 基于内容推荐算法html,基于内容的互联网推荐算法

    摘 要 本文介B了网络推荐的算法思想.帮助读者了解这个研究领域.在介绍了推荐系统的概念和定义之后,重点介绍了基于内容的互联网推荐算法. 关键词 推荐系统 推荐算法 互联网 中图分类号:TP391.3 ...

  9. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

最新文章

  1. 萨克斯维修服务器,萨克斯常见故障修理方法
  2. 第四课 CSS核心知识点
  3. html表格自动换行
  4. java bitset用途_浅谈Java BitSet使用场景和代码示例
  5. JIL 编译与 AOT 编译
  6. ARM中各始终之间的关系,FCLK HCLK PCLK的关系
  7. 60-170-040-使用-Time-Flink时间系统系列之实例讲解-如何做定时输出
  8. linux下共享win下文件夹权限问题,通过Samba从Windows向Linux系统传文件权限问题
  9. 用友t+畅捷通使用方法_【财务人员必看干货】用友财务软件使用方法和快捷键大全!...
  10. 开天辟地-Go语言的见面仪式
  11. python win32com 字体选择_用python的win32com模块替换word中的文字搞定批量打印奖状...
  12. Flask 框架学习1
  13. CAN笔记(4) 协议基本概念
  14. 如何使用 JS 实现带字母的导航城市列表,以及城市搜索
  15. 无所不能的Python竟然没有一个像样的定时器?试试这个!
  16. 速腾聚创RS-LiDAR激光雷达点云格式转换
  17. 【文献翻译】MDC-Checker:一种新的多域配置网络风险评估框架
  18. Linux添加环境变量,以配置MySQL环境怕变量为例
  19. 在 GitHub 上利用 SHA-1 值(commit ID)搜索某一次的提交内容
  20. websocket+php+layIm实现 单聊、群聊功能 即时通讯【可发送图片文件】

热门文章

  1. DPU1.1S-高性能、低功耗4口高速USB2.0HUB控制器芯片
  2. java控制台打印输出菱形,菱形高度自定义
  3. 使用Python的selenium,模拟12306登陆
  4. 哥本哈根消防队员埃里希的感人故事
  5. 就算这个世界拒绝了你——也不放弃未来
  6. 今天发现的一个好的学习php的网站
  7. linux tee错误日志,linux tee命令使用详解教程
  8. 用ChatGPT做一款二次元卡牌游戏!完成度超90%,即将开放源码!
  9. 关于堆内存和栈内存释放
  10. 赵国栋:大数据时代经济发展转型之道