快速pagerank和个性化pagerank的实现
fast-pagerank的Python项目详细描述
快速个性化PageRank实现
我需要一个快速的网页排名为Wikisim项目。它必须足够快才能在相对较大的图形上实时运行。networkx显然是可以使用的库,但是它需要从我的图形表示(这是相当标准的csr矩阵)到它的内部图形数据结构的来回转换。这些翻译减缓了进程。
我在python中实现了算法的两个版本,它们都受到Cleve Moler的书Experiments with MATLAB中给出的稀疏快速解决方案的启发。功率法速度快得多,精度足以完成我们的任务。
个性化页面排名
我稍微修改了一下算法,以便能够计算个性化的pagerank以及。
与流行的python实现的比较:networkx和igraph
这两种实现(精确解和power方法)都比networkx中相应的方法快得多。power方法也比igraph本机实现快,igraph本机实现也是基于特征向量的解决方案。基准测试是在sagemaker实例上完成的。
NetworkX PageRank的主要缺点是什么?
我放弃使用networkx有一个简单的原因:我必须多次计算pagerank,而我对一个图的内部表示是一个简单的稀疏矩阵。每次我想计算pagerank时,我都必须将它转换为networkx的图形表示,这很慢。我的基准测试表明networkx有一个非常快速的pagerank(networkx.pagerank_numpy
和networkx.pagerank_scipy
)实现,但是在进行实际计算之前,从它自己的图形数据结构转换到csr矩阵正是降低整个算法速度的原因。
note:在基准测试中,我没有计算在nx.from_scipy_sparse_matrix
(在将csr矩阵传递给networkx pagerank之前转换csr矩阵)上花费的时间,但我可以!因为这是我的另一个瓶颈,对于许多其他情况,一个有一个csr
邻接矩阵。
python实现
python包位于https://github.com/asajadi/fast-pagerank中,您可以在README.md文件中找到安装指南。您还可以在the jupyter notebook或this blog post中找到详细的分析。
用法
安装:
pip install fast-pagerank
示例
让我们从https://www.cs.princeton.edu/~chazelle/courses/BIB/pagerank.htm
假设a=0,b=1,c=2,d=3:
>>> import numpy as np
>>> from scipy import sparse
>>> from fast_pagerank import pagerank
>>> from fast_pagerank import pagerank_power
>>> A = np.array([[0,1], [0, 2], [1, 2],[2,0],[3,2]])
>>> weights = [1,1,1,1,1]
>>> G = sparse.csr_matrix((weights, (A[:,0], A[:,1])), shape=(4, 4))
>>> pr=pagerank(G, p=0.85)
>>> pr
array([0.37252685, 0.19582391, 0.39414924, 0.0375 ])
输出元素基本上是写在节点上的相同的数字,但是规范化了(向量乘以4,您将得到相同的数字)
我们可以添加个性化设置,或者使用power方法:
>>> personalize = np.array([0.4, 0.2, 0.2, 0.4])
>>> pr=pagerank_power(G, p=0.85, personalize=personalize, tol=1e-6)
>>> pr
array([0.37817981, 0.18572635, 0.38609383, 0.05 ])