首页 > 解决方案 > 函数计算与人工计算的计算区别

问题描述

我现在面临一个谜。我在某些程序中得到了奇怪的结果,我认为这可能与计算有关,因为与手动计算相比,我的函数得到了不同的结果。

这是来自我的程序,我正在打印值预计算:

print("\nPrecomputation:\nmatrix\n:", matrix)
tmp = likelihood_left * likelihood_right
print("\nconditional_dep:", tmp)
print("\nfinal result:", matrix @ tmp)

我得到以下输出:

Precomputation:
matrix: 
[array([0.08078721, 0.5802404 , 0.16957052, 0.09629893, 0.07310294])
 array([0.14633129, 0.45458744, 0.20096238, 0.02142105, 0.17669784])
 array([0.41198731, 0.06197812, 0.05934063, 0.23325626, 0.23343768])
 array([0.15686545, 0.29516415, 0.20095091, 0.14720275, 0.19981674])
 array([0.15965914, 0.18383683, 0.10606946, 0.14234812, 0.40808645])]

conditional_dep: [0.01391123 0.01388155 0.17221067 0.02675524 0.01033257]
final result: [0.07995043 0.03485223 0.02184015 0.04721548 0.05323298]

问题是当我计算以下代码时:

matrix = [np.array([0.08078721, 0.5802404 , 0.16957052, 0.09629893, 0.07310294]),
          np.array([0.14633129, 0.45458744, 0.20096238, 0.02142105, 0.17669784]), 
          np.array([0.41198731, 0.06197812, 0.05934063, 0.23325626, 0.23343768]), 
          np.array([0.15686545, 0.29516415, 0.20095091, 0.14720275, 0.19981674]), 
          np.array([0.15965914, 0.18383683, 0.10606946, 0.14234812, 0.40808645])]

tmp = np.asarray([0.01391123, 0.01388155, 0.17221067, 0.02675524, 0.01033257])

matrix @ tmp

使用的值与之前计算中的值完全相同,但我得到以下结果:

array([0.04171218, 0.04535276, 0.02546353, 0.04688848, 0.03106443])

这个结果显然与前一个结果不同,并且是真实的结果(我手动计算了点积)。

我整天都在面对这个问题,但我没有在网上找到任何有用的东西。如果你们中的任何人有任何微小的想法,我会非常高兴:D

提前感谢 Yann

PS:如果需要,我可以显示更多代码。PS2:我不知道它是否相关,但这用于动态编程算法。

标签: pythonnumpydot-product

解决方案


看起来您在其中一个矩阵乘法中切换了操作数。

使用您提供的 和 的相同值,并提供matrix您显示的两个结果。1tmpmatrix @ tmptmp @ matrix

matrix = [np.array([0.08078721, 0.5802404 , 0.16957052, 0.09629893, 0.07310294]),
          np.array([0.14633129, 0.45458744, 0.20096238, 0.02142105, 0.17669784]), 
          np.array([0.41198731, 0.06197812, 0.05934063, 0.23325626, 0.23343768]), 
          np.array([0.15686545, 0.29516415, 0.20095091, 0.14720275, 0.19981674]), 
          np.array([0.15965914, 0.18383683, 0.10606946, 0.14234812, 0.40808645])]
tmp = np.asarray([0.01391123, 0.01388155, 0.17221067, 0.02675524, 0.01033257])

print(matrix @ tmp)  # [0.04171218 0.04535276 0.02546353 0.04688848 0.03106443]
print(tmp @ matrix)  # [0.07995043 0.03485222 0.02184015 0.04721548 0.05323298]

为了让您的代码在做什么更加明显,您也可以考虑使用np.dot而不是@. 如果您matrix作为第一个参数和tmp第二个参数传递,它将得到您想要的结果,并且更清楚地表明您在概念上计算点积而不是矩阵相乘。


作为附加说明,如果您要对 执行矩阵运算matrix,最好是单个二维数组而不是一维数组列表。如果您尝试运行,这将防止您现在看到的那种错误matrix @ matrix。这也可以让你说matrix.dot(tmp)而不是np.dot(matrix, tmp)如果你愿意。

(我猜你可以使用np.stack或类似的函数来创建matrix,或者你可以在创建后调用np.stackmatrix


1因为tmp只有一个维度并且matrix有两个维度,NumPy 可以并且将视为tmp使乘法工作的任何类型的向量(使用广播)。Sotmp被视为 in 的列向量matrix @ tmp和 in 的行向量tmp @ matrix


推荐阅读