繁体   English   中英

Matlab和Python中矩阵乘法和求幂的结果不同

[英]Different results in Matlab and Python for matrix multiplication and exponentiation

从Matlab迁移到Python时,矩阵乘法和求幂得到了不同的结果。

这是一个简单的softmax分类器实现。 我运行Python代码,将变量导出为mat文件,然后运行原始Matlab代码,加载从Python导出的变量,然后进行比较。

Python代码:

f = np.array([[4714, 4735, 4697], [4749, 4748, 4709]])
f = f.astype(np.float64)
a = np.array([[0.001, 0.001, 0.001], [0.001, 0.001, 0.001], [0.001, 0.001, 0.001]])

reg = f.dot(a)
omega = np.exp(reg)
sumomega = np.sum(omega, axis=1)

io.savemat('python_variables.mat', {'p_f': f,
                                    'p_a': a,
                                    'p_reg': reg,
                                    'p_omega': omega,
                                    'p_sumomega': sumomega})

Matlab代码:

f = [4714, 4735, 4697; 4749, 4748, 4709];
a = [0.001, 0.001, 0.001; 0.001, 0.001, 0.001; 0.001, 0.001, 0.001];

reg = f*a;
omega = exp(reg);
sumomega = sum(omega, 2);
load('python_variables.mat');

我通过检查以下内容来比较结果:

norm(f - p_f) = 0
norm(a - p_a) = 0
norm(reg - p_reg) = 3.0767e-15
norm(omega - p_omega) = 4.0327e-09
norm(omega - exp(p_f*p_a)) = 0

因此,差异似乎是由乘法引起的,而exp()会使差异变得更大。 而且我的原始数据矩阵比这大。 我得到了更大的欧米茄值:

norm(reg - p_reg) = 7.0642e-12
norm(omega - p_omega) = 1.2167e+250

这也导致在某些情况下,sumomega在Python中变为inf或为零,而在Matlab中却未变为0,因此分类器输出有所不同。

我在这里想念什么? 如何解决以获得完全相同的结果?

对我来说,差异看起来像数值精度。 对于浮点运算,运算顺序很重要。 对操作进行重新排序时,您得到(略)不同的结果,因为四舍五入的发生方式不同。

Python和MATLAB实现矩阵乘法的方式可能略有不同,因此,您不应期望获得完全相同的结果。

如果需要将e乘以该乘积的结果的乘方,则将产生具有更高不精确度的结果。 这只是浮点运算的本质。

这里的问题不是您在MATLAB和Python中没有得到完全相同的结果,而是因为它们都产生不精确的结果,并且您不知道所获得的精度。


已知softmax函数会溢出。 解决方案是从所有输入值中减去最大输入值。 有关更多详细信息,请参见其他问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM