有效实现页面排名的转换矩阵

时间:2014-05-06 23:05:49

标签: python algorithm numpy pagerank

我正在尝试实施PageRank。我在这里阅读说明:http://nlp.stanford.edu/IR-book/html/htmledition/markov-chains-1.html

enter image description here

对我来说一切都很清楚,但是我担心矩阵$ P $的构造。我发现以天真的方式构建$ P $会非常昂贵。例如:要实现步骤1,需要检查$ A $的每一行,然后检查该行的每个元素以查看是否所有元素都为零。对于步骤2,需要计算每行的1的数量。我可以想象我的代码有令人讨厌的慢循环。我想知道是否有智能线性代数技术可以有效地构建$ P $。我将使用python numpy进行编码。

编辑:现在我想解决这个问题的一种方法是在$ A $的列上做一个求和元素。我会有一个列向量。现在我将遍历此向量的每个元素以检查哪些元素为零。因此,我现在可以知道哪些行没有1,我可以将这些行乘以$ 1 / N $。

1 个答案:

答案 0 :(得分:2)

您的担忧是正确的。由于网页的数量(代表图中的顶点)很大,因此无法实际生成此类A并对其进行处理。

使用sparse matrix实现可以更有效地计算页面排名的矩阵计算,因为矩阵非常稀疏。大多数网页实际上并未相互连接,因此矩阵中的大多数条目都为0。

稀疏矩阵的构建如下:

  • 如果A_ij = 1是边缘,则按(i,j)所述构建矩阵A,否则A_ij = 0
  • 通常不会执行步骤1,而是迭代地删除“接收器”。这样做是为了防止矩阵密集,一些替代方案也将“接收器”链接回链接到它们的节点,或者将接收器链接到自身。
  • 按照(2)
  • 中的描述划分A中的每个1

让我们将结果矩阵表示为M,这是我们将要处理的结果矩阵,以获得列向量p(每个条目初始化为1 / n) 。

x = [1/n, 1/n, ... , 1/n]^T //a column vector
p = [1/n, 1/n, ... , 1/n]^T //a column vector with the initial ranks
M = genSparseMatrix() //as described above
do until p converge:
    p = (1-\alpha)* M*p + (\alpha) * x
return p

最后,这会产生p,它是保存每个节点的页面排名值的列向量。