我正在尝试实施PageRank。我在这里阅读说明:http://nlp.stanford.edu/IR-book/html/htmledition/markov-chains-1.html
对我来说一切都很清楚,但是我担心矩阵$ P $的构造。我发现以天真的方式构建$ P $会非常昂贵。例如:要实现步骤1,需要检查$ A $的每一行,然后检查该行的每个元素以查看是否所有元素都为零。对于步骤2,需要计算每行的1的数量。我可以想象我的代码有令人讨厌的慢循环。我想知道是否有智能线性代数技术可以有效地构建$ P $。我将使用python numpy进行编码。
编辑:现在我想解决这个问题的一种方法是在$ A $的列上做一个求和元素。我会有一个列向量。现在我将遍历此向量的每个元素以检查哪些元素为零。因此,我现在可以知道哪些行没有1,我可以将这些行乘以$ 1 / N $。答案 0 :(得分:2)
您的担忧是正确的。由于网页的数量(代表图中的顶点)很大,因此无法实际生成此类A
并对其进行处理。
使用sparse matrix实现可以更有效地计算页面排名的矩阵计算,因为矩阵非常稀疏。大多数网页实际上并未相互连接,因此矩阵中的大多数条目都为0。
稀疏矩阵的构建如下:
A_ij = 1
是边缘,则按(i,j)
所述构建矩阵A,否则A_ij = 0
让我们将结果矩阵表示为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
,它是保存每个节点的页面排名值的列向量。