基于社交网络的推荐--包括给用户推荐好友的原理及代码实现

简介: 基于社交网络的推荐--包括给用户推荐好友的原理及代码实现

获取社交网络数据途径


社交网络数据的来源有下面几个:

电子邮件

用户注册信息:比如公司、学校等 (用于冷启动问题)

用户的位置数据:IP地址或者GPS数据

论坛和讨论组 (这个获取的一般是兴趣爱好)

即时聊天工具:QQ

社交网站: Facebook (社交图谱) Twitter (兴趣图谱)


社交网络数据简介


我们用图G(V,E,W)定义一个社交网络:


V是顶点集合,每个顶点是一个用户id

E是边集合,如果Va和Vb有社交关系,即存在E(a,b)

W(a,b)表示边的权重


一般来说,有3种不同的社交网络数据:


双向确认的社交网络数据:一般通过无向图表示

单向关注的社交网络数据:用户关系是单向的,可以通过有向图表示

基于社区的社交网络数据:比如豆瓣小组


基于社交网络的推荐


利用用户的社交网络数据进行推荐优点:

1.好友推荐可以增加推荐的信任度

2.社交网络可以解决冷启动问题

(缺点:由于用户的好友关系可能不是基于共同兴趣产生的,例如a-b是基于b的颜值??所以用户好友的兴趣与用户兴趣不一致)


基于领域的社会化推荐


1)最简单的方法是给用户推荐好友喜欢的物品集合,用户u对物品i的兴趣pui可以通过如下公式计算:

1.png

其中out(u)是用户u的好友集合,如果用户v喜欢物品i,则rvi=1,否则为0


2)当然,不同好友之间的熟悉度和兴趣相似度是不一样的,因此应该在推荐的时候把这个考虑在内:2.png


这里的wuv由两部分相似度构成,一部分是用户u和用户v的熟悉程度,另一部分是用户u和用户v的兴趣相似度。

其中,用户u和用户v的熟悉程度由如下公式度量,即他们之间的共同好友比例:

而用户u和用户v的兴趣相似度由如下公式度量,即他们喜欢的物品重合度:

3.png


从两方面改进基于邻域的社会化推荐算法


两处截断:


第一处截断:哪用户好友集合时只拿出和用户相似度最高的N个好友

第二处截断:查询用户行为做兴趣相似度时,只返回最近1个月的行为

重新设计数据库


给用户推荐好友


基于内容的匹配


常用内容属性包括:

用户的人口统计学属性(年龄、职业、性别等);

用户的兴趣(喜欢的物品和发布过的言论);

用户的位置信息(用户住址、邮编、IP等);


基于共同兴趣的好友推荐


利用UserCF的思想,如果两个用户喜欢相同的物品(比如同一条微博),就说明他们具有相似的兴趣;此外,也可以根据用户在社交网络中的评论提取用户的兴趣标签,来计算用户的兴趣相似度。


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


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

out(u)是在社交网络图中用户u指向的其他好友的集合

in(u)是在社交网络图中指向用户u的用户集合


通过用户u和用户v的出度和入度,定义W。根据相似度W进行推荐


计算相似度方法的解释在最后代码里

有下面几种方法计算相似度:

1.用户u,v的共同好友比例来计算相似度

5.png

def FriendSuggestion_out(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
#     i = 0
    for u_friend in G_out[u]:
#         i += 1
        for u_friend_friend in G_in[u_friend]:
            if u_friend_friend in friends:
                continue
            suggestions.setdefault(u_friend_friend,0)
            suggestions[u_friend_friend] += 1
    for i,j in suggestions.items():
        if i == u:
            continue
        if len(G_out[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_out[u]) * len(G_out[i])) 
#     return dict(sorted(suggestions.items(),key=itemgetter(1),reverse=True)[:k])
    return suggestions

2.关注u,v的用户的集合交集计算相似度

6.png

def FriendSuggestion_in(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
#     i = 0
    for u_friend in G_in[u]:
#         i += 1
        for u_friend_friend in G_out[u_friend]:
            if u_friend_friend in friends:
                continue
            suggestions.setdefault(u_friend_friend,0)
            suggestions[u_friend_friend] += 1
#         print(i)
#         suggestions[u_friend] = suggestions[u_friend_friend]
    for i,j in suggestions.items():
        if i == u:
            continue
        if len(G_in[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_in[u]) * len(G_in[i])) 
    return suggestions

3.u关注的用户中,有多大比例也关注用户v,同时施加惩罚in(v)来计算相似度

(考虑到某一名人,存在很多粉丝,导致每个人都与名人有很大相似度 例如有一亿粉丝的何老师~)

7.png

def FriendSuggestion_mix(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
    for u_friend in G_out[u]:
        for u_friend_friend in G_out[u_friend]:
            if u_friend_friend in friends:
                continue
            suggestions.setdefault(u_friend_friend,0)
            suggestions[u_friend_friend] += 1
#         suggestions[u_friend] = suggestions[u_friend_friend]
    for i,j in suggestions.items():
        if len(G_in[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_out[u]) * len(G_in[i])) 
    return suggestions


实现给用户推荐好友的完整过程代码


import os
import math
from operator import itemgetter
from sklearn.model_selection import train_test_split
import random
#获取文件列表 取前200个文件¶
edges = [name for name in os.listdir('twitter/')
         if name.endswith(".edges")]
#edges[:5]
train_G_out = dict()
test_G_out = dict()
train_G_in = dict()
test_G_in = dict()
#获取文件名的ID 以及.edges文件里的id 得到out in 两个字典
for file in edges[:200]:
    with open('twitter/' + file) as f:
        lines = f.readlines()
    for line in lines:
        a,b = line.split(" ")
        b = b.strip("\n")
        if random.random() < 0.8: #划分数据集
            train_G_out.setdefault(file[:-6],set())
            train_G_out.setdefault(a,set())
            train_G_out.setdefault(b,set())
            train_G_out[file[:-6]].add(a)
            train_G_out[file[:-6]].add(b)
            train_G_out[a].add(b)
            train_G_in.setdefault(file[:-6],set())
            train_G_in.setdefault(a,set())
            train_G_in.setdefault(b,set())
            train_G_in[a].add(file[:-6])
            train_G_in[b].add(a)
            train_G_in[b].add(file[:-6]) #str
        else:
            test_G_out.setdefault(file[:-6],set())
            test_G_out.setdefault(a,set())
            test_G_out.setdefault(b,set())
            test_G_out[file[:-6]].add(a)
            test_G_out[file[:-6]].add(b)
            test_G_out[a].add(b)
            test_G_in.setdefault(file[:-6],set())
            test_G_in.setdefault(a,set())
            test_G_in.setdefault(b,set())
            test_G_in[a].add(file[:-6])
            test_G_in[b].add(a)
            test_G_in[b].add(file[:-6]) #str
def FriendSuggestion_out(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
#     i = 0
    for u_friend in G_out[u]:  #遍历用户u关注的好友
#         i += 1
        for u_friend_friend in G_in[u_friend]: #u关注的好友中的粉丝列表
            if u_friend_friend in friends: #若粉丝是u关注的好友就跳过
                continue
            suggestions.setdefault(u_friend_friend,0) 
            suggestions[u_friend_friend] += 1 #对于u关注的好友的粉丝与u有一个交集 进行+1
    for i,j in suggestions.items():
        if i == u:  #去除本身
            suggestions[i] = 0
        elif len(G_out[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_out[u]) * len(G_out[i])) 
#     return dict(sorted(suggestions.items(),key=itemgetter(1),reverse=True)[:k])
    return suggestions
def FriendSuggestion_in(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
#     i = 0
    for u_friend in G_in[u]: #遍历关注用户u的粉丝
#         i += 1
        for u_friend_friend in G_out[u_friend]: #u的粉丝的关注列表好友
            if u_friend_friend in friends:
                continue
            suggestions.setdefault(u_friend_friend,0)
            suggestions[u_friend_friend] += 1  #uv的粉丝交集 +1
#         print(i)
#         suggestions[u_friend] = suggestions[u_friend_friend]
    for i,j in suggestions.items():
        if i == u:
            suggestions[i] = 0
        elif len(G_in[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_in[u]) * len(G_in[i])) 
    return suggestions
def FriendSuggestion_mix(u,G_out,G_in):
    suggestions = dict()
    G_out.setdefault(u,set())
    G_in.setdefault(u,set())
    friends = G_out[u]
    for u_friend in G_out[u]: #遍历u关注的好友列表
        for u_friend_friend in G_out[u_friend]: #遍历u好友的关注列表 即u关注的好友是u_friend_friend的粉丝 
            if u_friend_friend in friends:
                continue
            suggestions.setdefault(u_friend_friend,0)
            suggestions[u_friend_friend] += 1  #即u关注的好友有多大比例是用户v的粉丝 交集+1
#         suggestions[u_friend] = suggestions[u_friend_friend]
    for i,j in suggestions.items():
        if i == u:
            suggestions[i] = 0
        elif len(G_in[i]) == 0:
            suggestions[i] = 0
        else:
            suggestions[i] = j / math.sqrt(len(G_out[u]) * len(G_in[i])) 
    return suggestions
def recommend(u,G_out,G_in,k,choice):
    if choice == 'out':
        suggestions = FriendSuggestion_out(u,G_out,G_in)
    elif choice == 'in':
        suggestions = FriendSuggestion_in(u,G_out,G_in)
    else:
        suggestions = FriendSuggestion_mix(u,G_out,G_in)
    return dict(sorted(suggestions.items(),key=itemgetter(1),reverse=True)[:k])
def precision(k,choice):
    right = 0
    predict = 0
    for u in test_G_out.keys():
        x = recommend(u,train_G_out,train_G_in,k,choice)
        for i in x.keys():
            if i in test_G_out[u]:
                right += 1
        predict += k
    ans = right / (predict * 1.0)
    return ans * 100
#为用户‘100318079’推荐
print(recommend('100318079',train_G_out,train_G_in,5,'out'))
#验证测试集正确率
print("正确率:%.2f%%"%(precision(4,'mix')))
#{'217796457': 0.36794648440311994, 
#  '261753869': 0.3611730459561101, 
#  '92336981': 0.3611730459561101, 
#  '77618627': 0.35781322366606716, 
#  '540912889': 0.3517811819867572}
#正确率:19.80%
相关文章
|
2月前
|
网络协议 安全 5G
网络与通信原理
【10月更文挑战第14天】网络与通信原理涉及众多方面的知识,从信号处理到网络协议,从有线通信到无线通信,从差错控制到通信安全等。深入理解这些原理对于设计、构建和维护各种通信系统至关重要。随着技术的不断发展,网络与通信原理也在不断演进和完善,为我们的生活和工作带来了更多的便利和创新。
68 3
|
3月前
|
并行计算 安全 网络协议
探索未来网络:量子互联网的原理与应用
本文深入探讨了量子互联网的基本概念、技术原理及其潜在应用。通过对量子纠缠、量子叠加和量子隐形传态等核心概念的解释,文章展示了量子互联网如何利用量子力学特性来实现超高速、超高安全性的通信。此外,还讨论了量子互联网在金融、医疗、国防等领域的应用前景,以及当前面临的技术挑战和未来的发展方向。
78 2
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
|
27天前
|
运维 物联网 网络虚拟化
网络功能虚拟化(NFV):定义、原理及应用前景
网络功能虚拟化(NFV):定义、原理及应用前景
42 3
|
2月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
87 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
1月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
2月前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
169 1
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
2月前
|
存储 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系现代社会正常运转的关键支柱。本文旨在深入探讨网络安全漏洞的成因与影响,剖析加密技术的原理与应用,并强调提升公众安全意识的重要性。通过这些综合性的知识分享,我们期望为读者提供一个全面而深刻的网络安全视角,助力个人与企业在数字时代中稳健前行。
本文聚焦网络安全与信息安全领域,详细阐述了网络安全漏洞的潜在威胁、加密技术的强大防护作用以及安全意识培养的紧迫性。通过对真实案例的分析,文章揭示了网络攻击的多样性和复杂性,强调了构建全方位、多层次防御体系的必要性。同时,结合当前技术发展趋势,展望了未来网络安全领域的新挑战与新机遇,呼吁社会各界共同努力,共筑数字世界的安全防线。
|
2月前
|
存储 安全 自动驾驶
探索未来网络:量子互联网的原理与应用
【10月更文挑战第2天】 本文旨在探讨量子互联网的基本原理、技术实现及其在通讯领域的革命性应用前景。量子互联网利用量子力学原理,如量子叠加和量子纠缠,来传输信息,有望大幅提升通信的安全性和速度。通过详细阐述量子密钥分发(QKD)、量子纠缠交换和量子中继等关键技术,本文揭示了量子互联网对未来信息社会的潜在影响。