创建方式不同致相同初始矩阵在PageRank计算中结果异常
问题:PageRank初始矩阵自动创建后迭代结果异常
为PageRank算法创建n行1列的初始矩阵,手动创建转置后迭代50次结果正常;但用np.empty结合.fill自动创建的看似相同的矩阵,迭代后结果异常。尝试其他自动创建方式也得到异常结果,仅手动创建有效,但无法适配大规模矩阵,求原因。
手动创建代码及结果
代码
A = [[0.0375,0.4625,0.0375,0.32083333], [0.0375, 0.0375,0.0375,0.32083333], [0.8875, 0.0375, 0.0375, 0.32083333], [0.0375, 0.4625, 0.8875, 0.0375]] my_dp = 1/4 r = np.matrix([my_dp, my_dp, my_dp, my_dp]) r = np.transpose(r) print(r) for i in range(1,50): r = A*r print("Final:", print(r))
结果
[[0.25] [0.25] [0.25] [0.25]] [[0.3570795 ] [0.19760835] [0.30663962] [0.13867253]] Final: None
自动创建代码及结果
代码
r = np.empty(n) r.fill(my_dp) r = r[None].T print(r) for i in range(1,50): r = A*r print("Final:", print(r))
结果
[[0.25] [0.25] [0.25] [0.25]] [[3.35329783e-71 3.35329783e-71 7.21422583e-04 9.73677480e-18] [1.60559016e-25 3.35329783e-71 3.35329783e-71 9.73677480e-18] [1.60559016e-25 7.21422583e-04 3.35329783e-71 3.35329783e-71] [1.60559016e-25 3.35329783e-71 3.35329783e-71 3.35329783e-71]] Final: None
原因分析
核心问题是矩阵类型不匹配:
- 手动创建时,
r是np.matrix类型,Python会将列表形式的A自动转换为np.matrix,此时*执行的是线性代数中的矩阵乘法,符合PageRank的迭代逻辑。 - 自动创建时,
r是numpy.ndarray类型,列表形式的A会被转换为ndarray,此时*执行的是逐元素乘法(哈达玛积),完全不符合PageRank的矩阵迭代计算规则,最终导致结果异常。
解决方案
方案1:将自动创建的向量转为np.matrix类型
r = np.empty(n) r.fill(my_dp) r = np.matrix(r).T # 转成matrix类型后再转置为n行1列
方案2:统一使用ndarray,用矩阵乘法运算符@或np.dot
先将A转为ndarray,迭代时用正确的矩阵乘法方式:
A = np.array(A) r = np.empty(n) r.fill(my_dp) r = r.reshape(-1, 1) # 调整为n行1列的ndarray for i in range(1,50): r = A @ r # 或者使用 np.dot(A, r)
方案3:更简洁的初始矩阵创建方式
直接生成符合要求的matrix或ndarray:
# 生成matrix类型的初始向量 r = np.matrix([my_dp]*n).T # 生成ndarray类型的n行1列初始向量 r = np.full((n, 1), my_dp)
内容的提问来源于stack exchange,提问作者Drobdien
相关产品推荐
相关产品推荐

