机器学习手记[8]--Python Networkx库中PageRank算法实现源码分析
网上对 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/
importnetworkxasnx@not_implemented_for('multigraph')defpagerank(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 : d