python - 函数计算与人工计算的计算区别
问题描述
我现在面临一个谜。我在某些程序中得到了奇怪的结果,我认为这可能与计算有关,因为与手动计算相比,我的函数得到了不同的结果。
这是来自我的程序,我正在打印值预计算:
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:我不知道它是否相关,但这用于动态编程算法。
解决方案
看起来您在其中一个矩阵乘法中切换了操作数。
使用您提供的 和 的相同值,并提供matrix
您显示的两个结果。1tmp
matrix @ tmp
tmp @ 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.stack
。matrix
)
1因为tmp
只有一个维度并且matrix
有两个维度,NumPy 可以并且将视为tmp
使乘法工作的任何类型的向量(使用广播)。Sotmp
被视为 in 的列向量matrix @ tmp
和 in 的行向量tmp @ matrix
。
推荐阅读
- asp.net - SQL Server - 查询不显示列值为空的行
- python - python3中的编码/解码(伯克利数据库记录)
- python - 如何在 Python3 中读取 JSON 结果
- sql - 使用别名和子查询时要遵循哪些规则?
- ios - 列和行索引高于 SKTileMapNode 中的列和行数
- c# - 在 Windows 10 上的 C# 应用程序中安全地存储数据
- c# - C# Entity Framework Linq:选择 Where If/Else
- c# - 如何使为数组赋值成为可能,同时又不可能单独分配每个数组元素?
- eclipse - eclipse 3.8.1 cdt 8.6.0,从索引器中排除特定的系统头文件
- python - 如何在python中删除特定的csv行?