33丨PageRank(下):分析希拉里邮件中的人物关系
33丨PageRank(下):分析希拉里邮件中的人物关系
讲述:陈旸
时长09:15大小8.45M
如何使用工具实现 PageRank 算法
如何用 PageRank 揭秘希拉里邮件中的人物关系
总结
赞 8
提建议
精选留言(18)
- third2019-02-27pagerank 值是: {'C': 0.22514635472743896, 'A': 0.3245609358176832, 'D': 0.22514635472743894, 'B': 0.22514635472743896} import networkx as nx # 创建有向图 G = nx.DiGraph() # 有向图之间边的关系 edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: G.add_edge(edge[0], edge[1]) pagerank_list = nx.pagerank(G, alpha=0.85) print("pagerank 值是:", pagerank_list)展开
编辑回复: 正确。
6 - 永降不息之雨2019-07-03老师关于希拉里邮件的案例,这一段一直看不懂。 我print(temp)只有得到两个人名, 但是我print(edges_weights_temp)后 除了人名,后面还多了一个数字, 老师这数字是怎么来的,这段语法能帮忙解释一下吗? temp=(rew[0],row[1]) if temp not in edges_weights_temp: edges_weights_temp[temp] = 1 else: edges_weights_temp[temp] = edges_weights_temp[temp] + 1展开
编辑回复: 我在程序里保存边(发送者->接受者)的权重的代码: for row in zip(emails.MetadataFrom, emails.MetadataTo, emails.RawText): temp = (row[0], row[1]) if temp not in edges_weights_temp: edges_weights_temp[temp] = 1 else: edges_weights_temp[temp] = edges_weights_temp[temp] + 1 如果你print(edges_weights_temp)应该是类似这样的结果: {('Jake Sullivan', 'Hillary Clinton'): 815, ('nan', 'Hillary Clinton'): 20, ('Cheryl Mills', ';h'): 1, ... 这里('Jake Sullivan', 'Hillary Clinton') 就是我们的temp,也就(row[0], row[1]),也就是保存的发送者->接收者的次数,次数为815次。 if temp not in edges_weights_temp 判断下在字典edges_weights_temp中是否已经存在了边temp,如果没有存在就创建一个,赋值为1,也就是代表他们通信了1次。如果存在了,就找出来当时的次数,然后+1
共 4 条评论5 - szm2019-03-04有2个问题: 第一个:pagerank已经是字典类型了,为什么还要用pagerank_list = {node: rank for node, rank in pagerank.items()}将其转换为字典呢?是不是删掉这个语句也没关系? 第二个:阈值大于0.005的图仍有很多重叠在一起,无法观看,请问怎样才能让画出来的图像美观呢?
编辑回复: 第一个问题:对的,pagerank是字典类型,直接使用nx.set_node_attributes(graph, name = 'pagerank', values=pagerank)是OK的 第二个问题,阈值大于0.005时,很多图重叠在一起,可以采用nx.circular_layout(graph)来进行显示。这样可以让筛选出来的点都分布到一个圆上,来显示出来他们之间的关系。
4 - WS2019-08-05老师,怎么筛选出某个人物的有向图?
作者回复: 你可以通过 graph.edges取出所有的边,然后对所有边进行遍历查找
2 - mickey2019-03-05import networkx as nx # 创建有向图 G = nx.DiGraph() # 有向图之间边的关系 edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: G.add_edge(edge[0], edge[1]) pagerank_list = nx.pagerank(G) #alpha为阻尼因子,默认值:0.85 print("pagerank值是:", pagerank_list) pagerank值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}展开
作者回复: Good Job
2 - 王彬成2019-03-011、pagerank_list=nx.pagerank(G,alpha=1)理解 参考链接:https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.link_analysis.pagerank_alg.pagerank.html alpha指的是阻尼因子。根据公式了解到,这因子代表用户按照跳转链接来上网的概率。 题目说15%的概率随机跳转,所以阻尼因子为0.85 2、代码 import networkx as nx # 创建有向图 G=nx.DiGraph() # 有向图之间边的关系 edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: G.add_edge(edge[0],edge[1]) pagerank_list=nx.pagerank(G,alpha=0.85) print('pagerank 值是: ', pagerank_list) 3、结果 pagerank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}展开
编辑回复: 结果正确,对alpha阻尼因子的理解也正确
2 - 白夜2019-02-27默认阻尼就是0.85,alpha去掉完事、、 pagerank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}
编辑回复: 这样使用最方便,alpha默认是0.85
2 - 等待2020-03-30老师您好,想询问以下就是,在分析希拉里的邮件人物关系的过程中,阻尼因子为0.85是什么意思呢?什么情况之下才要阻尼因子为1呢? 麻烦老师了
作者回复: 阻尼因子d通常默认取值为0.85,d=1时模型退化为PageRank简化模型
共 3 条评论1 - 滢2019-04-21%15跳转概率,对应的阻尼因子是0.85 , 阻尼因子默认就是0.85,所以在创建的时候可以直接省略啊alpha参数的设定。 import networkx #创建有向图 digraph = networkx.DiGraph() #有向图之间边的关系 edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: digraph.add_edge(edge[0],edge[1]) pagerank_list = networkx.pagerank(digraph) print('PageRank 值是:',pagerank_list) 输出结果: PageRank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}展开
编辑回复: 正确,默认是0.85,所以可以省略。
1 - third2019-02-27提问: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access 不允许列被新属性创建??? 点击网页进去,也没有找到这个警告。 需要修改或者别的什么东西吗?展开1
- 小晨2021-02-26#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Peter import networkx as nx import matplotlib.pyplot as plt def show_graph(graph): # 使用Sprint Layout布局,类似中心放射状 positions = nx.spring_layout(graph) # 设置网格图中的节点大小,大小与pagerank无关,因为pagerank值很小所以需要*20000 nodesize = [x['pagerank'] * 20000 for v , x in graph.nodes(data=True)] # 设置网络图中的边长度 # edgesize = [np.sqrt(e[2]['weight']) for e in graph.edges(data=True)] # 绘制节点 nx.draw_networkx_nodes(graph , positions , node_size=nodesize , alpha=0.4) # 绘制边 nx.draw_networkx_edges(graph , positions , alpha=0.2) # 绘制节点的 label nx.draw_networkx_labels(graph , positions , font_size=10) #所有人物关系的关系图 plt.show() # 创建有向图 G = nx.DiGraph() # 有向图之间边的关系 edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: G.add_edge(edge[0],edge[1]) pagerank = nx.pagerank(G) print('Pagerank值:',pagerank) # 获取每个节点的pagerank数值 pagerank_list = {node: rank for node, rank in pagerank.items()} # 将 pagerank 数值作为节点的属性 nx.set_node_attributes(G, name = 'pagerank', values = pagerank) # 画网络图 show_graph(G)展开
作者回复: 代码正确!建议按照Python PEP8规范书写代码,对未来的工作很有用哦
共 2 条评论1 - 小匚2021-02-20老师好,我在跑的时候发现提示没有这个 edge_size 参数,我直接去掉了也跑出了和文章中相同的结果。nx.draw_networkx_edges(graph, positions, alpha=0.2)
作者回复: 之所以报错,是因为networkx版本更新后,更改了一部分参数的名称,比如:edge_size参数更名为nodelist。可以更改为nodelist参数,或者降低networkx的版本,比如:2.4版本,edge_size就不会报错了。
1 - 非同凡想2020-11-25import networkx as nx def test_page_rank(): G = nx.DiGraph() edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")] for edge in edges: G.add_edge(edge[0], edge[1]) pagerank_list = nx.pagerank(G, alpha=0.85) print(pagerank_list) test_page_rank() {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}展开
- 厚积薄发2020-10-29老师,问一下哈,edges_weights_temp = defaultdict(list)这行代码 使用list 是不是可以换成int,换成int,我试了一下也是可以的,使用defaultdict(list) 有什么特殊的用吗?
作者回复: 在希拉里邮件这个案例中,defaultdict(int)也可以。使用int还是list取决于字典的值需要存储多个值还是只需要存储单个整数,前者使用list更合适,而后者直接使用int即可。
- JustDoDT2020-04-11交作业,好累啊, https://github.com/LearningChanging/Data-analysis-in-action/tree/master/33-PageRank%EF%BC%88%E4%B8%8B%EF%BC%89%EF%BC%9A%E5%88%86%E6%9E%90%E5%B8%8C%E6%8B%89%E9%87%8C%E9%82%AE%E4%BB%B6%E4%B8%AD%E7%9A%84%E4%BA%BA%E7%89%A9%E5%85%B3%E7%B3%BB
- Untitled2020-03-15结果: {'A': 0.32456093581768314, 'B': 0.22514635472743894, 'D': 0.2251463547274389, 'C': 0.22514635472743894} 代码: import networkx as nx edges = [('A','B'),('A','D'),('A','C'),('B','A'),('B','D'),('C','A'),('D','B'),('D','C')] G1 = nx.DiGraph() G1.add_edges_from(edges) pagerank_list = nx.pagerank(G1, alpha=0.85)展开
- Ronnyz2019-11-23将alpha=0.85 pagerank值为: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}
作者回复: 对的 正确
- S.Mona2019-10-16pagerank计算的影响力,搜索结果按照影响力评分排序,这个和ElasticSearch的相关度评分排序搜索排序搜索结果有什么异同?