如何计算数百万个节点的个性化PageRank?

时间:2012-07-16 06:23:02

标签: python numpy scipy pagerank

我有一个包含大约一百万个节点和一千万个边的稀疏图。我想为每个节点计算个性化 PageRank,其中节点n的个性化PageRank是指:

# x_0 is a column vector of all zeros, except a 1 in the position corresponding to node n
# adjacency_matrix is a matrix with a 1 in position (i, j) if there is an edge from node i to node j

x_1 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_0
x_2 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_1
x_3 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_2

# x_3 now holds the personalized PageRank scores

# i'm basically approximating the personalized PageRank by running this for only 3 iterations

我尝试使用NumPy进行编码,但运行时间太长。 (大约1秒钟计算每个节点的个性化PageRank)

我也尝试将x_0更改为矩阵(通过组合几个不同节点的列向量),但这也没有多大帮助,实际上使计算需要更长的时间。 (可能是因为矩阵变得很快,所以它不再适合RAM?我不确定)

是否有其他建议的方法来计算这个,最好是在Python中?我还考虑过将非矩阵方法用于PageRank计算,通过三次迭代进行一种模拟随机游走(即,我开始每个节点得分为1,然后将该得分传播给其邻居等),但我不确定这是否会更快。它会是,如果是,为什么?

2 个答案:

答案 0 :(得分:1)

我原本认为“PageRank”算法最好被视为有向图http://en.wikipedia.org/wiki/Directed_graph(可能具有适当的权重)。

我喜欢http://networkx.lanl.org

上的networkx

您会发现它在算法下也有一个“PageRank”示例,您可以调整它。

答案 1 :(得分:1)

在您的情况下,如果您的数据以正确的方式存储,使用模拟随机游走迭代方法应该可以正常工作。当你的边数与节点数相比很少时(如你的情况),我不认为矩阵方法是一个很好的选择,因为它是一个非常稀疏的矩阵,但实际上这种方法意味着你正在检查对于任何i和j,存在从i到j的节点。 (顺便说一句,我不确定那些乘以零的运行时间真的需要多少。)

如果您的数据存储方式对于每个节点对象,您有一个其传出链接的目的地列表,则随机游走模拟方法将非常快。忽略阻尼因子,这是您在随机游走模拟的每次迭代中实际执行的操作:

for node in nodes:
    for destination in node.destinations:
        destination.pageRank += node.pageRank/len(destinations)

每次迭代的时间复杂度为O(n * k),在这种情况下,n = 1m且k = 10。如果我在这里没有遗漏任何东西,这听起来不错。