为什么使用python networkx模块的“阻尼”转换矩阵的特征向量不等于pagerank分数,请参见以下示例:
import numpy as np
M = np.array([[0, 0, 0, 0, 0 ],
[1/3, 0, 0, 1/2, 1/2],
[1/3, 0, 0, 1/2, 0 ],
[1/3, 1/2, 1/2, 0, 1/2],
[0, 1/2, 1/2, 0, 0 ]])
d=.85 #default damping factor
w0, v0 =np.linalg.eig(d*M + (1-d)*np.ones(M.shape))
import networkx as nx
nx_graph = nx.from_numpy_array(M)
scores = nx.pagerank(nx_graph,1)
分数与第一个特征向量完全不同。 这仅仅是一个规范化问题,还是可能存在概念上的错误? 以下“手动功能”返回了另一组分数:
def pagerank(M, eps=1.0e-8, d=0.85):
N = M.shape[1]
v = np.random.rand(N, 1)
v = v / np.linalg.norm(v, 1)
last_v = np.ones((N, 1), dtype=np.float32) * 100
while np.linalg.norm(v - last_v, 2) > eps:
last_v = v
v = d * np.matmul(M, v) + (1 - d) / N
return v