Homework4
题目:寻找关键用户和分析社交关系¶
data.json 数据描述¶
1. 用户节点数据包含用户ID和他们的"影响力分数",格式为["用户名称", 影响力分数]。¶
2. 边关系数据包含每两个用户之间的连接强度(即边的权重),格式为["用户名称1", "用户名称2", 关系权重]。¶
例如:
- 节点:["Yanyan-Wang", 50.95], ["Aarebecca", 23.82], ...
- 边:["Yanyan-Wang", "Aarebecca", 25.3], ["Yanyan-Wang", "pomelo-nwu", 25.09], ...
问题¶
1. 社交网络构建与分析¶
- a. 使用邻接矩阵或者字典表示法来表示这个社交关系网络。
- b. 请找出每个用户的直接朋友(即与其存在边关系的节点),并用列表形式列出。
2. 统计与度中心性分析¶
- a. 计算每个用户的度数(即直接朋友数量),列出度数最多的前5个用户及其朋友数量。
- b. 通过影响力分数(如上所示),找出影响力最高的前5个用户。
- c. 综合考虑影响力分数和朋友数量,列出对社交网络最有影响力的用户(可以选择将两者按一定比例加权,例如影响力得分的50%和朋友数量的50%)。
3. 推荐新朋友¶
- a. 对于用户 Yanyan-Wang,请找出其“朋友的朋友”中最有可能成为新朋友的用户,并列出推荐的理由(例如有最多共同的朋友)。
- b. 考虑用户之间的连接强度,找出与 Yanyan-Wang 连接强度最高的5个用户(无论是否已经是直接朋友),并列出推荐排序。
4. 网络图的可视化¶
- a. 使用图论可视化工具绘制用户关系网络图,展示关键用户和他们的连接情况。
- b. 你可以对图中的节点按“影响力得分”进行着色,节点的大小则代表度数,尝试解释在图中哪些用户在社交网络中最具影响力。
1. 社交网络构建与分析¶
- a. 使用邻接矩阵或者字典表示法来表示这个社交关系网络。
- b. 请找出每个用户的直接朋友(即与其存在边关系的节点),并用列表形式列出。
In [2]:
Copied!
import json
from collections import defaultdict
with open('data/hw4_data.json', 'r') as f:
data = json.load(f)
adj_dict = defaultdict(list) # 使用字典存储每个用户的邻居和关系权重
for e in data['edges']:
user1, user2, weight = e
# 无向图
adj_dict[user1].append((user2, weight))
adj_dict[user2].append((user1, weight))
print("字典表示法:")
for user, friends in adj_dict.items():
print(f"{user}: {friends}")
import json
from collections import defaultdict
with open('data/hw4_data.json', 'r') as f:
data = json.load(f)
adj_dict = defaultdict(list) # 使用字典存储每个用户的邻居和关系权重
for e in data['edges']:
user1, user2, weight = e
# 无向图
adj_dict[user1].append((user2, weight))
adj_dict[user2].append((user1, weight))
print("字典表示法:")
for user, friends in adj_dict.items():
print(f"{user}: {friends}")
字典表示法:
Yanyan-Wang: [('Aarebecca', 25.3), ('pomelo-nwu', 25.09), ('yangzy0603', 11.85), ('tyn1998', 9.62), ('yvonneyx', 7.39), ('lidongze0629', 7.25), ('RackweLLizm', 4.5), ('yikenie', 4.25), ('yubo0923', 3.61), ('Maple0817', 3.11), ('wj23027', 2.34), ('frank-zsy', 2.1), ('andyhuang18', 1.14), ('bifenglin', 0.86)]
Aarebecca: [('Yanyan-Wang', 25.3), ('pomelo-nwu', 24.84), ('yangzy0603', 11.92), ('yvonneyx', 7.73), ('lidongze0629', 6.58), ('tyn1998', 6.4), ('RackweLLizm', 4.84), ('yikenie', 4.55), ('yubo0923', 3.82), ('Maple0817', 3.27), ('frank-zsy', 0.97)]
pomelo-nwu: [('Yanyan-Wang', 25.09), ('Aarebecca', 24.84), ('yangzy0603', 13.85), ('tyn1998', 12.48), ('lidongze0629', 8.1), ('yvonneyx', 7.63), ('RackweLLizm', 4.97), ('yikenie', 4.66), ('bifenglin', 4.11), ('frank-zsy', 3.96), ('yubo0923', 3.9), ('wj23027', 3.86), ('andyhuang18', 3.56), ('Maple0817', 3.32), ('will-ww', 3.27), ('zhicheng-ning', 2.52), ('PureNatural', 2.36), ('xiaoya-yaya', 2.24), ('xgdyp', 2.1), ('longyanz', 2.1), ('Zzzzzhuzhiwei', 1.5), ('birdflyi', 1.33), ('lhbvvvvv', 1.09), ('zhaosj975', 1)]
andyhuang18: [('tyn1998', 15.28), ('wj23027', 11.03), ('will-ww', 8.19), ('zhicheng-ning', 7.88), ('lhbvvvvv', 7.07), ('frank-zsy', 6.29), ('bifenglin', 5.59), ('wxharry', 5.53), ('Zzzzzhuzhiwei', 5.31), ('stevending1st', 4.28), ('PureNatural', 3.83), ('pranavshuklaa', 3.75), ('pomelo-nwu', 3.56), ('stealth-bombeer', 3.2), ('Vlad116', 2.81), ('kunal8411', 2.78), ('xgdyp', 2.47), ('longyanz', 2.33), ('xiaoya-yaya', 2.28), ('zhaosj975', 1.56), ('birdflyi', 1.51), ('Yanyan-Wang', 1.14), ('yangzy0603', 0.83)]
tyn1998: [('andyhuang18', 15.28), ('pomelo-nwu', 12.48), ('frank-zsy', 11.87), ('wj23027', 10.64), ('bifenglin', 9.84), ('Yanyan-Wang', 9.62), ('will-ww', 9.15), ('Zzzzzhuzhiwei', 7.93), ('lhbvvvvv', 7.84), ('zhicheng-ning', 7.73), ('PureNatural', 7.32), ('yangzy0603', 7.15), ('xgdyp', 6.96), ('stevending1st', 6.85), ('wxharry', 6.54), ('Aarebecca', 6.4), ('birdflyi', 5.19), ('xiaoya-yaya', 5.09), ('pranavshuklaa', 4.19), ('lidongze0629', 4.1), ('yvonneyx', 3.87), ('stealth-bombeer', 3.51), ('RackweLLizm', 3.35), ('yikenie', 3.21), ('Vlad116', 3.05), ('longyanz', 2.96), ('zhaosj975', 2.84), ('yubo0923', 2.83), ('Maple0817', 2.51), ('kunal8411', 2.32)]
yangzy0603: [('pomelo-nwu', 13.85), ('Aarebecca', 11.92), ('Yanyan-Wang', 11.85), ('tyn1998', 7.15), ('yvonneyx', 5.84), ('lidongze0629', 5.6), ('RackweLLizm', 4.29), ('yikenie', 4.06), ('yubo0923', 3.47), ('Maple0817', 3.01), ('frank-zsy', 1.77), ('wj23027', 1.31), ('andyhuang18', 0.83), ('bifenglin', 0.67)]
bifenglin: [('will-ww', 13.32), ('tyn1998', 9.84), ('PureNatural', 7.75), ('xgdyp', 7.61), ('xiaoya-yaya', 7.42), ('frank-zsy', 6.4), ('zhicheng-ning', 6.34), ('birdflyi', 6.04), ('Zzzzzhuzhiwei', 5.79), ('andyhuang18', 5.59), ('pomelo-nwu', 4.11), ('longyanz', 3.97), ('wj23027', 3.62), ('lhbvvvvv', 3.55), ('stevending1st', 2.71), ('zhaosj975', 1.54), ('Yanyan-Wang', 0.86), ('yangzy0603', 0.67)]
will-ww: [('bifenglin', 13.32), ('zhicheng-ning', 10.82), ('tyn1998', 9.15), ('Zzzzzhuzhiwei', 8.83), ('andyhuang18', 8.19), ('frank-zsy', 7.62), ('PureNatural', 7.06), ('lhbvvvvv', 6.92), ('wj23027', 6.26), ('xiaoya-yaya', 6.19), ('xgdyp', 6.14), ('birdflyi', 4.97), ('longyanz', 3.69), ('stevending1st', 3.51), ('pomelo-nwu', 3.27), ('zhaosj975', 1.65), ('kunal8411', 0.79)]
frank-zsy: [('tyn1998', 11.87), ('Zzzzzhuzhiwei', 9.52), ('xgdyp', 8.44), ('will-ww', 7.62), ('PureNatural', 7.29), ('stevending1st', 6.84), ('birdflyi', 6.71), ('bifenglin', 6.4), ('andyhuang18', 6.29), ('lhbvvvvv', 5.92), ('wj23027', 5.48), ('zhicheng-ning', 5.33), ('pomelo-nwu', 3.96), ('xiaoya-yaya', 2.84), ('Yanyan-Wang', 2.1), ('yangzy0603', 1.77), ('wxharry', 1.51), ('pranavshuklaa', 1.34), ('stealth-bombeer', 1.26), ('kunal8411', 1.2), ('Vlad116', 1.2), ('zhaosj975', 1.09), ('Aarebecca', 0.97), ('lidongze0629', 0.89), ('longyanz', 0.89), ('yvonneyx', 0.88), ('RackweLLizm', 0.85), ('yikenie', 0.84), ('yubo0923', 0.81), ('Maple0817', 0.78)]
wj23027: [('andyhuang18', 11.03), ('tyn1998', 10.64), ('zhicheng-ning', 7.1), ('will-ww', 6.26), ('frank-zsy', 5.48), ('Zzzzzhuzhiwei', 4.53), ('lhbvvvvv', 4.43), ('pomelo-nwu', 3.86), ('bifenglin', 3.62), ('stevending1st', 3.37), ('kunal8411', 2.74), ('Yanyan-Wang', 2.34), ('PureNatural', 2.21), ('xgdyp', 1.87), ('xiaoya-yaya', 1.85), ('longyanz', 1.83), ('wxharry', 1.71), ('pranavshuklaa', 1.49), ('stealth-bombeer', 1.4), ('Vlad116', 1.32), ('yangzy0603', 1.31), ('birdflyi', 1.25), ('zhaosj975', 1)]
zhicheng-ning: [('will-ww', 10.82), ('andyhuang18', 7.88), ('tyn1998', 7.73), ('wj23027', 7.1), ('bifenglin', 6.34), ('Zzzzzhuzhiwei', 6.11), ('frank-zsy', 5.33), ('lhbvvvvv', 4.97), ('PureNatural', 4.63), ('xgdyp', 4.23), ('xiaoya-yaya', 4.11), ('stevending1st', 3.07), ('birdflyi', 3.01), ('longyanz', 2.72), ('pomelo-nwu', 2.52), ('kunal8411', 2.02), ('zhaosj975', 1.26)]
Zzzzzhuzhiwei: [('frank-zsy', 9.52), ('will-ww', 8.83), ('tyn1998', 7.93), ('xgdyp', 7.71), ('lhbvvvvv', 7.37), ('PureNatural', 6.49), ('birdflyi', 6.22), ('zhicheng-ning', 6.11), ('bifenglin', 5.79), ('andyhuang18', 5.31), ('stevending1st', 4.96), ('wj23027', 4.53), ('xiaoya-yaya', 3.69), ('wxharry', 2.22), ('pranavshuklaa', 1.87), ('stealth-bombeer', 1.72), ('Vlad116', 1.6), ('longyanz', 1.59), ('pomelo-nwu', 1.5), ('zhaosj975', 0.67)]
xgdyp: [('frank-zsy', 8.44), ('Zzzzzhuzhiwei', 7.71), ('PureNatural', 7.67), ('bifenglin', 7.61), ('birdflyi', 6.99), ('tyn1998', 6.96), ('will-ww', 6.14), ('xiaoya-yaya', 4.75), ('zhicheng-ning', 4.23), ('stevending1st', 3.91), ('lhbvvvvv', 3.23), ('andyhuang18', 2.47), ('longyanz', 2.34), ('pomelo-nwu', 2.1), ('wj23027', 1.87), ('zhaosj975', 0.93)]
lidongze0629: [('pomelo-nwu', 8.1), ('Yanyan-Wang', 7.25), ('Aarebecca', 6.58), ('yangzy0603', 5.6), ('tyn1998', 4.1), ('yvonneyx', 3.93), ('RackweLLizm', 3.4), ('yikenie', 3.26), ('yubo0923', 2.86), ('Maple0817', 2.54), ('frank-zsy', 0.89)]
lhbvvvvv: [('tyn1998', 7.84), ('Zzzzzhuzhiwei', 7.37), ('andyhuang18', 7.07), ('will-ww', 6.92), ('frank-zsy', 5.92), ('zhicheng-ning', 4.97), ('wj23027', 4.43), ('wxharry', 4.08), ('PureNatural', 3.66), ('bifenglin', 3.55), ('stevending1st', 3.54), ('xgdyp', 3.23), ('pranavshuklaa', 3.02), ('birdflyi', 2.78), ('stealth-bombeer', 2.66), ('Vlad116', 2.38), ('xiaoya-yaya', 1.98), ('pomelo-nwu', 1.09), ('zhaosj975', 1.09), ('longyanz', 0.89)]
PureNatural: [('bifenglin', 7.75), ('xgdyp', 7.67), ('tyn1998', 7.32), ('frank-zsy', 7.29), ('will-ww', 7.06), ('Zzzzzhuzhiwei', 6.49), ('birdflyi', 6.01), ('zhicheng-ning', 4.63), ('xiaoya-yaya', 4.15), ('andyhuang18', 3.83), ('lhbvvvvv', 3.66), ('stevending1st', 3.36), ('pomelo-nwu', 2.36), ('longyanz', 2.26), ('wj23027', 2.21), ('zhaosj975', 1.43)]
yvonneyx: [('Aarebecca', 7.73), ('pomelo-nwu', 7.63), ('Yanyan-Wang', 7.39), ('yangzy0603', 5.84), ('lidongze0629', 3.93), ('tyn1998', 3.87), ('RackweLLizm', 3.24), ('yikenie', 3.11), ('yubo0923', 2.75), ('Maple0817', 2.45), ('frank-zsy', 0.88)]
xiaoya-yaya: [('bifenglin', 7.42), ('will-ww', 6.19), ('tyn1998', 5.09), ('xgdyp', 4.75), ('PureNatural', 4.15), ('zhicheng-ning', 4.11), ('Zzzzzhuzhiwei', 3.69), ('birdflyi', 3.33), ('longyanz', 2.94), ('frank-zsy', 2.84), ('andyhuang18', 2.28), ('pomelo-nwu', 2.24), ('lhbvvvvv', 1.98), ('wj23027', 1.85), ('stevending1st', 1.69), ('zhaosj975', 0.67)]
birdflyi: [('xgdyp', 6.99), ('frank-zsy', 6.71), ('Zzzzzhuzhiwei', 6.22), ('bifenglin', 6.04), ('PureNatural', 6.01), ('tyn1998', 5.19), ('will-ww', 4.97), ('stevending1st', 3.48), ('xiaoya-yaya', 3.33), ('zhicheng-ning', 3.01), ('lhbvvvvv', 2.78), ('andyhuang18', 1.51), ('longyanz', 1.36), ('pomelo-nwu', 1.33), ('wj23027', 1.25), ('zhaosj975', 0.67)]
stevending1st: [('tyn1998', 6.85), ('frank-zsy', 6.84), ('Zzzzzhuzhiwei', 4.96), ('andyhuang18', 4.28), ('xgdyp', 3.91), ('lhbvvvvv', 3.54), ('will-ww', 3.51), ('birdflyi', 3.48), ('wj23027', 3.37), ('PureNatural', 3.36), ('zhicheng-ning', 3.07), ('bifenglin', 2.71), ('wxharry', 2.03), ('pranavshuklaa', 1.73), ('kunal8411', 1.69), ('xiaoya-yaya', 1.69), ('stealth-bombeer', 1.6), ('Vlad116', 1.5)]
wxharry: [('tyn1998', 6.54), ('andyhuang18', 5.53), ('lhbvvvvv', 4.08), ('pranavshuklaa', 3.95), ('stealth-bombeer', 3.35), ('Vlad116', 2.93), ('Zzzzzhuzhiwei', 2.22), ('stevending1st', 2.03), ('wj23027', 1.71), ('frank-zsy', 1.51)]
RackweLLizm: [('pomelo-nwu', 4.97), ('Aarebecca', 4.84), ('Yanyan-Wang', 4.5), ('yangzy0603', 4.29), ('lidongze0629', 3.4), ('tyn1998', 3.35), ('yvonneyx', 3.24), ('yikenie', 2.77), ('yubo0923', 2.48), ('Maple0817', 2.23), ('frank-zsy', 0.85)]
yikenie: [('pomelo-nwu', 4.66), ('Aarebecca', 4.55), ('Yanyan-Wang', 4.25), ('yangzy0603', 4.06), ('lidongze0629', 3.26), ('tyn1998', 3.21), ('yvonneyx', 3.11), ('RackweLLizm', 2.77), ('yubo0923', 2.4), ('Maple0817', 2.17), ('frank-zsy', 0.84)]
pranavshuklaa: [('tyn1998', 4.19), ('wxharry', 3.95), ('andyhuang18', 3.75), ('lhbvvvvv', 3.02), ('stealth-bombeer', 2.6), ('Vlad116', 2.34), ('Zzzzzhuzhiwei', 1.87), ('stevending1st', 1.73), ('wj23027', 1.49), ('frank-zsy', 1.34)]
longyanz: [('bifenglin', 3.97), ('will-ww', 3.69), ('tyn1998', 2.96), ('xiaoya-yaya', 2.94), ('zhicheng-ning', 2.72), ('xgdyp', 2.34), ('andyhuang18', 2.33), ('PureNatural', 2.26), ('pomelo-nwu', 2.1), ('wj23027', 1.83), ('Zzzzzhuzhiwei', 1.59), ('birdflyi', 1.36), ('lhbvvvvv', 0.89), ('frank-zsy', 0.89), ('zhaosj975', 0.83)]
yubo0923: [('pomelo-nwu', 3.9), ('Aarebecca', 3.82), ('Yanyan-Wang', 3.61), ('yangzy0603', 3.47), ('lidongze0629', 2.86), ('tyn1998', 2.83), ('yvonneyx', 2.75), ('RackweLLizm', 2.48), ('yikenie', 2.4), ('Maple0817', 1.99), ('frank-zsy', 0.81)]
stealth-bombeer: [('tyn1998', 3.51), ('wxharry', 3.35), ('andyhuang18', 3.2), ('lhbvvvvv', 2.66), ('pranavshuklaa', 2.6), ('Vlad116', 2.11), ('Zzzzzhuzhiwei', 1.72), ('stevending1st', 1.6), ('wj23027', 1.4), ('frank-zsy', 1.26)]
Maple0817: [('pomelo-nwu', 3.32), ('Aarebecca', 3.27), ('Yanyan-Wang', 3.11), ('yangzy0603', 3.01), ('lidongze0629', 2.54), ('tyn1998', 2.51), ('yvonneyx', 2.45), ('RackweLLizm', 2.23), ('yikenie', 2.17), ('yubo0923', 1.99), ('frank-zsy', 0.78)]
Vlad116: [('tyn1998', 3.05), ('wxharry', 2.93), ('andyhuang18', 2.81), ('lhbvvvvv', 2.38), ('pranavshuklaa', 2.34), ('stealth-bombeer', 2.11), ('Zzzzzhuzhiwei', 1.6), ('stevending1st', 1.5), ('wj23027', 1.32), ('frank-zsy', 1.2)]
zhaosj975: [('tyn1998', 2.84), ('will-ww', 1.65), ('andyhuang18', 1.56), ('bifenglin', 1.54), ('PureNatural', 1.43), ('zhicheng-ning', 1.26), ('frank-zsy', 1.09), ('lhbvvvvv', 1.09), ('pomelo-nwu', 1), ('wj23027', 1), ('xgdyp', 0.93), ('longyanz', 0.83), ('birdflyi', 0.67), ('xiaoya-yaya', 0.67), ('Zzzzzhuzhiwei', 0.67)]
kunal8411: [('andyhuang18', 2.78), ('wj23027', 2.74), ('tyn1998', 2.32), ('zhicheng-ning', 2.02), ('stevending1st', 1.69), ('frank-zsy', 1.2), ('will-ww', 0.79)]
In [3]:
Copied!
# 找出每个用户的直接朋友
direct_friends = {user: [friend for friend, _ in friends] for user, friends in adj_dict.items()}
# 输出每个用户的直接朋友
print("\n每个用户的直接朋友:")
for user, friends in direct_friends.items():
print(f"{user}: {friends}")
# 找出每个用户的直接朋友
direct_friends = {user: [friend for friend, _ in friends] for user, friends in adj_dict.items()}
# 输出每个用户的直接朋友
print("\n每个用户的直接朋友:")
for user, friends in direct_friends.items():
print(f"{user}: {friends}")
每个用户的直接朋友: Yanyan-Wang: ['Aarebecca', 'pomelo-nwu', 'yangzy0603', 'tyn1998', 'yvonneyx', 'lidongze0629', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817', 'wj23027', 'frank-zsy', 'andyhuang18', 'bifenglin'] Aarebecca: ['Yanyan-Wang', 'pomelo-nwu', 'yangzy0603', 'yvonneyx', 'lidongze0629', 'tyn1998', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817', 'frank-zsy'] pomelo-nwu: ['Yanyan-Wang', 'Aarebecca', 'yangzy0603', 'tyn1998', 'lidongze0629', 'yvonneyx', 'RackweLLizm', 'yikenie', 'bifenglin', 'frank-zsy', 'yubo0923', 'wj23027', 'andyhuang18', 'Maple0817', 'will-ww', 'zhicheng-ning', 'PureNatural', 'xiaoya-yaya', 'xgdyp', 'longyanz', 'Zzzzzhuzhiwei', 'birdflyi', 'lhbvvvvv', 'zhaosj975'] andyhuang18: ['tyn1998', 'wj23027', 'will-ww', 'zhicheng-ning', 'lhbvvvvv', 'frank-zsy', 'bifenglin', 'wxharry', 'Zzzzzhuzhiwei', 'stevending1st', 'PureNatural', 'pranavshuklaa', 'pomelo-nwu', 'stealth-bombeer', 'Vlad116', 'kunal8411', 'xgdyp', 'longyanz', 'xiaoya-yaya', 'zhaosj975', 'birdflyi', 'Yanyan-Wang', 'yangzy0603'] tyn1998: ['andyhuang18', 'pomelo-nwu', 'frank-zsy', 'wj23027', 'bifenglin', 'Yanyan-Wang', 'will-ww', 'Zzzzzhuzhiwei', 'lhbvvvvv', 'zhicheng-ning', 'PureNatural', 'yangzy0603', 'xgdyp', 'stevending1st', 'wxharry', 'Aarebecca', 'birdflyi', 'xiaoya-yaya', 'pranavshuklaa', 'lidongze0629', 'yvonneyx', 'stealth-bombeer', 'RackweLLizm', 'yikenie', 'Vlad116', 'longyanz', 'zhaosj975', 'yubo0923', 'Maple0817', 'kunal8411'] yangzy0603: ['pomelo-nwu', 'Aarebecca', 'Yanyan-Wang', 'tyn1998', 'yvonneyx', 'lidongze0629', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817', 'frank-zsy', 'wj23027', 'andyhuang18', 'bifenglin'] bifenglin: ['will-ww', 'tyn1998', 'PureNatural', 'xgdyp', 'xiaoya-yaya', 'frank-zsy', 'zhicheng-ning', 'birdflyi', 'Zzzzzhuzhiwei', 'andyhuang18', 'pomelo-nwu', 'longyanz', 'wj23027', 'lhbvvvvv', 'stevending1st', 'zhaosj975', 'Yanyan-Wang', 'yangzy0603'] will-ww: ['bifenglin', 'zhicheng-ning', 'tyn1998', 'Zzzzzhuzhiwei', 'andyhuang18', 'frank-zsy', 'PureNatural', 'lhbvvvvv', 'wj23027', 'xiaoya-yaya', 'xgdyp', 'birdflyi', 'longyanz', 'stevending1st', 'pomelo-nwu', 'zhaosj975', 'kunal8411'] frank-zsy: ['tyn1998', 'Zzzzzhuzhiwei', 'xgdyp', 'will-ww', 'PureNatural', 'stevending1st', 'birdflyi', 'bifenglin', 'andyhuang18', 'lhbvvvvv', 'wj23027', 'zhicheng-ning', 'pomelo-nwu', 'xiaoya-yaya', 'Yanyan-Wang', 'yangzy0603', 'wxharry', 'pranavshuklaa', 'stealth-bombeer', 'kunal8411', 'Vlad116', 'zhaosj975', 'Aarebecca', 'lidongze0629', 'longyanz', 'yvonneyx', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817'] wj23027: ['andyhuang18', 'tyn1998', 'zhicheng-ning', 'will-ww', 'frank-zsy', 'Zzzzzhuzhiwei', 'lhbvvvvv', 'pomelo-nwu', 'bifenglin', 'stevending1st', 'kunal8411', 'Yanyan-Wang', 'PureNatural', 'xgdyp', 'xiaoya-yaya', 'longyanz', 'wxharry', 'pranavshuklaa', 'stealth-bombeer', 'Vlad116', 'yangzy0603', 'birdflyi', 'zhaosj975'] zhicheng-ning: ['will-ww', 'andyhuang18', 'tyn1998', 'wj23027', 'bifenglin', 'Zzzzzhuzhiwei', 'frank-zsy', 'lhbvvvvv', 'PureNatural', 'xgdyp', 'xiaoya-yaya', 'stevending1st', 'birdflyi', 'longyanz', 'pomelo-nwu', 'kunal8411', 'zhaosj975'] Zzzzzhuzhiwei: ['frank-zsy', 'will-ww', 'tyn1998', 'xgdyp', 'lhbvvvvv', 'PureNatural', 'birdflyi', 'zhicheng-ning', 'bifenglin', 'andyhuang18', 'stevending1st', 'wj23027', 'xiaoya-yaya', 'wxharry', 'pranavshuklaa', 'stealth-bombeer', 'Vlad116', 'longyanz', 'pomelo-nwu', 'zhaosj975'] xgdyp: ['frank-zsy', 'Zzzzzhuzhiwei', 'PureNatural', 'bifenglin', 'birdflyi', 'tyn1998', 'will-ww', 'xiaoya-yaya', 'zhicheng-ning', 'stevending1st', 'lhbvvvvv', 'andyhuang18', 'longyanz', 'pomelo-nwu', 'wj23027', 'zhaosj975'] lidongze0629: ['pomelo-nwu', 'Yanyan-Wang', 'Aarebecca', 'yangzy0603', 'tyn1998', 'yvonneyx', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817', 'frank-zsy'] lhbvvvvv: ['tyn1998', 'Zzzzzhuzhiwei', 'andyhuang18', 'will-ww', 'frank-zsy', 'zhicheng-ning', 'wj23027', 'wxharry', 'PureNatural', 'bifenglin', 'stevending1st', 'xgdyp', 'pranavshuklaa', 'birdflyi', 'stealth-bombeer', 'Vlad116', 'xiaoya-yaya', 'pomelo-nwu', 'zhaosj975', 'longyanz'] PureNatural: ['bifenglin', 'xgdyp', 'tyn1998', 'frank-zsy', 'will-ww', 'Zzzzzhuzhiwei', 'birdflyi', 'zhicheng-ning', 'xiaoya-yaya', 'andyhuang18', 'lhbvvvvv', 'stevending1st', 'pomelo-nwu', 'longyanz', 'wj23027', 'zhaosj975'] yvonneyx: ['Aarebecca', 'pomelo-nwu', 'Yanyan-Wang', 'yangzy0603', 'lidongze0629', 'tyn1998', 'RackweLLizm', 'yikenie', 'yubo0923', 'Maple0817', 'frank-zsy'] xiaoya-yaya: ['bifenglin', 'will-ww', 'tyn1998', 'xgdyp', 'PureNatural', 'zhicheng-ning', 'Zzzzzhuzhiwei', 'birdflyi', 'longyanz', 'frank-zsy', 'andyhuang18', 'pomelo-nwu', 'lhbvvvvv', 'wj23027', 'stevending1st', 'zhaosj975'] birdflyi: ['xgdyp', 'frank-zsy', 'Zzzzzhuzhiwei', 'bifenglin', 'PureNatural', 'tyn1998', 'will-ww', 'stevending1st', 'xiaoya-yaya', 'zhicheng-ning', 'lhbvvvvv', 'andyhuang18', 'longyanz', 'pomelo-nwu', 'wj23027', 'zhaosj975'] stevending1st: ['tyn1998', 'frank-zsy', 'Zzzzzhuzhiwei', 'andyhuang18', 'xgdyp', 'lhbvvvvv', 'will-ww', 'birdflyi', 'wj23027', 'PureNatural', 'zhicheng-ning', 'bifenglin', 'wxharry', 'pranavshuklaa', 'kunal8411', 'xiaoya-yaya', 'stealth-bombeer', 'Vlad116'] wxharry: ['tyn1998', 'andyhuang18', 'lhbvvvvv', 'pranavshuklaa', 'stealth-bombeer', 'Vlad116', 'Zzzzzhuzhiwei', 'stevending1st', 'wj23027', 'frank-zsy'] RackweLLizm: ['pomelo-nwu', 'Aarebecca', 'Yanyan-Wang', 'yangzy0603', 'lidongze0629', 'tyn1998', 'yvonneyx', 'yikenie', 'yubo0923', 'Maple0817', 'frank-zsy'] yikenie: ['pomelo-nwu', 'Aarebecca', 'Yanyan-Wang', 'yangzy0603', 'lidongze0629', 'tyn1998', 'yvonneyx', 'RackweLLizm', 'yubo0923', 'Maple0817', 'frank-zsy'] pranavshuklaa: ['tyn1998', 'wxharry', 'andyhuang18', 'lhbvvvvv', 'stealth-bombeer', 'Vlad116', 'Zzzzzhuzhiwei', 'stevending1st', 'wj23027', 'frank-zsy'] longyanz: ['bifenglin', 'will-ww', 'tyn1998', 'xiaoya-yaya', 'zhicheng-ning', 'xgdyp', 'andyhuang18', 'PureNatural', 'pomelo-nwu', 'wj23027', 'Zzzzzhuzhiwei', 'birdflyi', 'lhbvvvvv', 'frank-zsy', 'zhaosj975'] yubo0923: ['pomelo-nwu', 'Aarebecca', 'Yanyan-Wang', 'yangzy0603', 'lidongze0629', 'tyn1998', 'yvonneyx', 'RackweLLizm', 'yikenie', 'Maple0817', 'frank-zsy'] stealth-bombeer: ['tyn1998', 'wxharry', 'andyhuang18', 'lhbvvvvv', 'pranavshuklaa', 'Vlad116', 'Zzzzzhuzhiwei', 'stevending1st', 'wj23027', 'frank-zsy'] Maple0817: ['pomelo-nwu', 'Aarebecca', 'Yanyan-Wang', 'yangzy0603', 'lidongze0629', 'tyn1998', 'yvonneyx', 'RackweLLizm', 'yikenie', 'yubo0923', 'frank-zsy'] Vlad116: ['tyn1998', 'wxharry', 'andyhuang18', 'lhbvvvvv', 'pranavshuklaa', 'stealth-bombeer', 'Zzzzzhuzhiwei', 'stevending1st', 'wj23027', 'frank-zsy'] zhaosj975: ['tyn1998', 'will-ww', 'andyhuang18', 'bifenglin', 'PureNatural', 'zhicheng-ning', 'frank-zsy', 'lhbvvvvv', 'pomelo-nwu', 'wj23027', 'xgdyp', 'longyanz', 'birdflyi', 'xiaoya-yaya', 'Zzzzzhuzhiwei'] kunal8411: ['andyhuang18', 'wj23027', 'tyn1998', 'zhicheng-ning', 'stevending1st', 'frank-zsy', 'will-ww']
2. 统计与度中心性分析¶
- a. 计算每个用户的度数(即直接朋友数量),列出度数最多的前5个用户及其朋友数量。
- b. 通过影响力分数(如上所示),找出影响力最高的前5个用户。
- c. 综合考虑影响力分数和朋友数量,列出对社交网络最有影响力的用户(可以选择将两者按一定比例加权,例如影响力得分的50%和朋友数量的50%)。
In [4]:
Copied!
# 计算每个用户的度数(直接朋友数量)
user_degrees = {user: len(friends) for user, friends in direct_friends.items()}
# 找出度数最多的前5个用户
top_5_by_degree = sorted(user_degrees.items(), key=lambda x: x[1], reverse=True)[:5]
print("度数最多的前5个用户及朋友数量:")
for user, degree in top_5_by_degree:
print(f"{user}: {degree} 位朋友")
# 计算每个用户的度数(直接朋友数量)
user_degrees = {user: len(friends) for user, friends in direct_friends.items()}
# 找出度数最多的前5个用户
top_5_by_degree = sorted(user_degrees.items(), key=lambda x: x[1], reverse=True)[:5]
print("度数最多的前5个用户及朋友数量:")
for user, degree in top_5_by_degree:
print(f"{user}: {degree} 位朋友")
度数最多的前5个用户及朋友数量: tyn1998: 30 位朋友 frank-zsy: 30 位朋友 pomelo-nwu: 24 位朋友 andyhuang18: 23 位朋友 wj23027: 23 位朋友
In [5]:
Copied!
# 找出影响力最高的前5个用户
user_influence = {node[0]: node[1] for node in data['nodes']}
top_5_by_influence = sorted(user_influence.items(), key=lambda x: x[1], reverse=True)[:5]
print("\n影响力最高的前5个用户:")
for user, influence in top_5_by_influence:
print(f"{user}: 影响力分数 {influence}")
# 找出影响力最高的前5个用户
user_influence = {node[0]: node[1] for node in data['nodes']}
top_5_by_influence = sorted(user_influence.items(), key=lambda x: x[1], reverse=True)[:5]
print("\n影响力最高的前5个用户:")
for user, influence in top_5_by_influence:
print(f"{user}: 影响力分数 {influence}")
影响力最高的前5个用户: Yanyan-Wang: 影响力分数 50.95 Aarebecca: 影响力分数 23.82 pomelo-nwu: 影响力分数 22.36 tyn1998: 影响力分数 16.64 frank-zsy: 影响力分数 15.8
In [6]:
Copied!
# 综合影响力得分 (影响力得分50% + 朋友数量50%)
combined_influence = {user: 0.5 * user_influence.get(user, 0) + 0.5 * user_degrees.get(user, 0)
for user in user_influence.keys()}
# 找出综合影响力最高的前5个用户
top_5_by_combined_influence = sorted(combined_influence.items(), key=lambda x: x[1], reverse=True)[:5]
print("\n综合影响力最高的前5个用户(影响力得分50% + 朋友数量50%):")
for user, score in top_5_by_combined_influence:
print(f"{user}: 综合得分 {score}")
# 综合影响力得分 (影响力得分50% + 朋友数量50%)
combined_influence = {user: 0.5 * user_influence.get(user, 0) + 0.5 * user_degrees.get(user, 0)
for user in user_influence.keys()}
# 找出综合影响力最高的前5个用户
top_5_by_combined_influence = sorted(combined_influence.items(), key=lambda x: x[1], reverse=True)[:5]
print("\n综合影响力最高的前5个用户(影响力得分50% + 朋友数量50%):")
for user, score in top_5_by_combined_influence:
print(f"{user}: 综合得分 {score}")
综合影响力最高的前5个用户(影响力得分50% + 朋友数量50%): Yanyan-Wang: 综合得分 32.475 tyn1998: 综合得分 23.32 pomelo-nwu: 综合得分 23.18 frank-zsy: 综合得分 22.9 Aarebecca: 综合得分 17.41
3. 推荐新朋友¶
- a. 对于用户 Yanyan-Wang,请找出其“朋友的朋友”中最有可能成为新朋友的用户,并列出推荐的理由(例如有最多共同的朋友)。
- b. 考虑用户之间的连接强度,找出与 Yanyan-Wang 连接强度最高的5个用户(无论是否已经是直接朋友),并列出推荐排序。
In [7]:
Copied!
target_user = "Yanyan-Wang"
# 获取Yanyan-Wang的直接朋友
friends1 = set(direct_friends.get(target_user, []))
# 统计朋友的朋友
potential_new_friends = defaultdict(int)
for friend in friends1:
friends_of_friend = set(direct_friends.get(friend, []))
for fof in friends_of_friend:
if fof != target_user and fof not in friends1: # 排除Yanyan-Wang和其直接朋友
potential_new_friends[fof] += 1 # 统计共同朋友数量
# 找出朋友的朋友中最有可能成为新朋友的用户(共同朋友最多)
recommended_new_friends = sorted(potential_new_friends.items(), key=lambda x: x[1], reverse=True)
print(f"推荐给 {target_user} 的新朋友及推荐理由:")
for user, mutual_friends in recommended_new_friends:
print(f"{user}: 有 {mutual_friends} 个共同朋友")
target_user = "Yanyan-Wang"
# 获取Yanyan-Wang的直接朋友
friends1 = set(direct_friends.get(target_user, []))
# 统计朋友的朋友
potential_new_friends = defaultdict(int)
for friend in friends1:
friends_of_friend = set(direct_friends.get(friend, []))
for fof in friends_of_friend:
if fof != target_user and fof not in friends1: # 排除Yanyan-Wang和其直接朋友
potential_new_friends[fof] += 1 # 统计共同朋友数量
# 找出朋友的朋友中最有可能成为新朋友的用户(共同朋友最多)
recommended_new_friends = sorted(potential_new_friends.items(), key=lambda x: x[1], reverse=True)
print(f"推荐给 {target_user} 的新朋友及推荐理由:")
for user, mutual_friends in recommended_new_friends:
print(f"{user}: 有 {mutual_friends} 个共同朋友")
推荐给 Yanyan-Wang 的新朋友及推荐理由: Zzzzzhuzhiwei: 有 6 个共同朋友 lhbvvvvv: 有 6 个共同朋友 longyanz: 有 6 个共同朋友 birdflyi: 有 6 个共同朋友 xgdyp: 有 6 个共同朋友 zhaosj975: 有 6 个共同朋友 xiaoya-yaya: 有 6 个共同朋友 zhicheng-ning: 有 6 个共同朋友 PureNatural: 有 6 个共同朋友 will-ww: 有 6 个共同朋友 stevending1st: 有 5 个共同朋友 wxharry: 有 4 个共同朋友 stealth-bombeer: 有 4 个共同朋友 pranavshuklaa: 有 4 个共同朋友 Vlad116: 有 4 个共同朋友 kunal8411: 有 4 个共同朋友
In [8]:
Copied!
# 计算与Yanyan-Wang连接强度的用户
connection_strengths = defaultdict(float)
for edge in data['edges']:
user1, user2, weight = edge
if user1 == target_user:
connection_strengths[user2] = weight
elif user2 == target_user:
connection_strengths[user1] = weight
# 按连接强度排序,找出强度最高的5个用户
top_5_by_strength = sorted(connection_strengths.items(), key=lambda x: x[1], reverse=True)[:5]
print(f"\n与 {target_user} 连接强度最高的前5个用户:")
for user, strength in top_5_by_strength:
print(f"{user}: 连接强度 {strength}")
# 计算与Yanyan-Wang连接强度的用户
connection_strengths = defaultdict(float)
for edge in data['edges']:
user1, user2, weight = edge
if user1 == target_user:
connection_strengths[user2] = weight
elif user2 == target_user:
connection_strengths[user1] = weight
# 按连接强度排序,找出强度最高的5个用户
top_5_by_strength = sorted(connection_strengths.items(), key=lambda x: x[1], reverse=True)[:5]
print(f"\n与 {target_user} 连接强度最高的前5个用户:")
for user, strength in top_5_by_strength:
print(f"{user}: 连接强度 {strength}")
与 Yanyan-Wang 连接强度最高的前5个用户: Aarebecca: 连接强度 25.3 pomelo-nwu: 连接强度 25.09 yangzy0603: 连接强度 11.85 tyn1998: 连接强度 9.62 yvonneyx: 连接强度 7.39
4. 网络图的可视化¶
- a. 使用图论可视化工具绘制用户关系网络图,展示关键用户和他们的连接情况。
- b. 你可以对图中的节点按“影响力得分”进行着色,节点的大小则代表度数,尝试解释在图中哪些用户在社交网络中最具影响力。
In [10]:
Copied!
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
# 添加节点和边
for node, influence in user_influence.items():
G.add_node(node, influence=influence) # 添加用户节点,带有影响力分数属性
for edge in data['edges']:
user1, user2, weight = edge
G.add_edge(user1, user2, weight=weight) # 添加用户之间的连接,带有权重属性
# 获取节点的度数和影响力
node_degrees = dict(G.degree())
node_influence = {node: G.nodes[node]['influence'] for node in G.nodes()}
# 根据度数调整节点大小
node_sizes = [node_degrees[node] * 100 for node in G.nodes()] # 放大尺寸,便于可视化
# 根据影响力得分调整节点颜色
node_colors = [node_influence[node] for node in G.nodes()]
# 绘制图
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G)
# 绘制节点,按影响力着色,按度数调整大小
nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_colors, cmap=plt.cm.Blues, alpha=0.9)
nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_color='black')
# 添加颜色条表示影响力得分
sm = plt.cm.ScalarMappable(cmap=plt.cm.Blues, norm=plt.Normalize(vmin=min(node_colors), vmax=max(node_colors)))
sm.set_array([])
plt.colorbar(sm, label="Influence Score")
plt.title("User Relationship Network (Node Size = Degree, Node Color = Influence Score)")
plt.axis('off')
plt.show()
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
# 添加节点和边
for node, influence in user_influence.items():
G.add_node(node, influence=influence) # 添加用户节点,带有影响力分数属性
for edge in data['edges']:
user1, user2, weight = edge
G.add_edge(user1, user2, weight=weight) # 添加用户之间的连接,带有权重属性
# 获取节点的度数和影响力
node_degrees = dict(G.degree())
node_influence = {node: G.nodes[node]['influence'] for node in G.nodes()}
# 根据度数调整节点大小
node_sizes = [node_degrees[node] * 100 for node in G.nodes()] # 放大尺寸,便于可视化
# 根据影响力得分调整节点颜色
node_colors = [node_influence[node] for node in G.nodes()]
# 绘制图
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G)
# 绘制节点,按影响力着色,按度数调整大小
nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_colors, cmap=plt.cm.Blues, alpha=0.9)
nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_color='black')
# 添加颜色条表示影响力得分
sm = plt.cm.ScalarMappable(cmap=plt.cm.Blues, norm=plt.Normalize(vmin=min(node_colors), vmax=max(node_colors)))
sm.set_array([])
plt.colorbar(sm, label="Influence Score")
plt.title("User Relationship Network (Node Size = Degree, Node Color = Influence Score)")
plt.axis('off')
plt.show()
C:\Users\tommy\AppData\Local\Temp\ipykernel_14304\3604136048.py:35: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes. plt.colorbar(sm, label="Influence Score")