networkx 笔记:pagerank
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了networkx 笔记:pagerank相关的知识,希望对你有一定的参考价值。
理论部分可参考:李宏毅线性代数笔记 10: PageRank_UQI-LIUWJ的博客-CSDN博客
1 构造图
networkx相关部分可参考:python库整理:networkx 包_UQI-LIUWJ的博客-CSDN博客_networkx库
import networkx as nx
G=nx.DiGraph()
#创建有向图
edges = [("A", "B"), ("A", "C"), ("A", "D"),
("B", "A"), ("B", "D"), ("C", "A"),
("D", "B"), ("D", "C")]
#有向图边之间的关系
G.add_edges_from(edges)
#根据连边构造图
nx.draw(G,with_labels=True)
#画图
2 pagerank
pagerank_list=nx.pagerank(G,alpha=0.85)
pagerank_list
'''
'A': 0.3245609358176831,
'B': 0.22514635472743894,
'C': 0.22514635472743894,
'D': 0.22514635472743894
'''
这里的alpha表示多少比例是根据连边选择link的,1-alpha表示随机选择link
所以alpha为0的时候是纯随机,每个link最终都是0.25
pagerank_list=nx.pagerank(G,alpha=0)
pagerank_list
'''
'A': 0.25, 'B': 0.25, 'C': 0.25, 'D': 0.25
'''
2.1 手动计算pagerank
pagerank_list=nx.pagerank(G,alpha=1)
pagerank_list.values()
'''
dict_values([0.33333396911621094, 0.22222201029459634, 0.22222201029459634, 0.22222201029459634])
'''
我们可以知道
A=, 结果应该是A的特征值1对应的特征向量:
计算特征向量可以参考:numpy笔记 linalg_UQI-LIUWJ的博客-CSDN博客
import numpy as np a=np.array([[0,1/2,1,0], [1/3,0,0,1/2], [1/3,0,0,1/2], [1/3,1/2,0,0]]) np.linalg.eig(a) ''' (array([-0.5, 1. , 0. , -0.5]), array([[-0.8660254 , 0.65465367, 0.70710678, 0.8660254 ], [ 0.28867513, 0.43643578, -0.47140452, -0.28867513], [ 0.28867513, 0.43643578, 0.23570226, -0.28867513], [ 0.28867513, 0.43643578, -0.47140452, -0.28867513]])) '''
eig的结果返回两个对象,第一个是特征值,第二个矩阵每一列是对应的特征向量
然后pagerank的结果需要和为1,于是我们对第二列进行等比例放缩
np.linalg.eig(a)[1][:,1]/sum(np.linalg.eig(a)[1][:,1])
#array([0.33333333, 0.22222222, 0.22222222, 0.22222222])
可以看到,结果和networkx计算出来的是一样的
与50位技术专家面对面 20年技术见证,附赠技术全景图以上是关于networkx 笔记:pagerank的主要内容,如果未能解决你的问题,请参考以下文章