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的主要内容,如果未能解决你的问题,请参考以下文章

线性代数目录

李宏毅深度学习笔记——呕心整理版

《深度学习》 --李宏毅学习笔记总结 (待更新)

李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布

《2021机器学习-李宏毅》学习笔记

深度学习李宏毅《机器学习》学习笔记