网上对Page算法讲解的很多,实现代码也很多很杂, 所以为了找到一个更高质量的PageRank算法的实现,
我阅读了Python Networkx库上自带的pagerank方法的源码。部分多余内容我删除了,有兴趣可以直接下这个库查看源码
源码的地址在http://networkx.github.io/download.html
具体的pagerank代码我已经上传到网盘在http://pan.baidu.com/s/1ntOafH3
PageRank算法最主要的地方在于对两个问题的解决,一个是dangling nodes,一个是spider trap
前者是说,没有引用其他网页的链接,用图角度的理解就是出度为0。
后者是说,进入到一个网页或者几个网页,这个单个网页,或者几个网页之间相互引用,这样资源进去后就一直在里面转,出不来了,造成rank sink问题。
对于dangling nodes,我们可以计算他们的PR贡献值,然后均分给所有节点
对于spider trap,需要用心灵漂移的方式去解决。
Networkx库里面,主要有三种计算PageRank的方法(PS为什么是三种,我直观觉得是因为这是三个人写的,因为连某些效果完全相同的初始化语句,三个写的都不一样)
1 pagerank函数
以图结构为基础
通过迭代收敛方法计算PR值(PageRank值)
2 pagerank_numpy函数
将图转换为numpy邻接矩阵,
通过google_matrix和numpy矩阵计算
通过计算最大特征值对应的主特征向量,即为所求PR值
3 pagerank_scipy函数
将图转换为sparse稀疏矩阵
通过迭代收敛方法计算PR值
"""PageRank analysis of graph structure. """
# BSD license.
# NetworkX:http://networkx.lanl.gov/
import networkx as nx
@not_implemented_for('multigraph')
def pagerank(G, alpha=0.85, personalization=None,
max_iter=100, tol=1.0e-6, nstart=None, weight='weight',
dangling=None):
"""Return the PageRank of the nodes in the graph.
Parameters
-----------
G : graph
A NetworkX graph. 在PageRank算法里面是有向图
alpha : float, optional
稳定系数, 默认0.85, 心灵漂移teleporting系数,用于解决spider trap问题
personalization: dict, optional
个性化向量,确定在分配中各个节点的权重
格式举例,比如四个点的情况: {1:0.25,2:0.25,3:0.25,4:0.25}
默认个点权重相等,也可以给某个节点多分配些权重,需保证权重和为1.
max_iter : integer, optional
最大迭代次数
tol : float, optional
迭代阈值
nstart : dictionary, optional
整个网络各节点PageRank初始值
weight : key, optional
各边权重
dangling: dict, optional
字典存储的是dangling边的信息
key --dangling边的尾节点,也就是dangling node节点
value --dangling边的权重
PR值按多大程度将资源分配给dangling node是根据personalization向量分配的
This must be selected to result in an irreducible transition
matrix (see notes under google_matrix). It may be common to have the
dangling dict to be th