You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建方式不同致相同初始矩阵在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:40:42