给定以下数组:
X = np.array([[1, 27, 3], [4, -1, 6]])
W = np.array([2, 4, 3])
这两个方程是等价的:
sum_a = 0
for l in range(len(X)):
sum_a += np.sum(W * X[l]) # 141
sum_b = np.sum(np.sum(W * X)) # 141
但这两个不是:
sum_a = 0
for l in range(len(X)):
sum_a += np.exp(np.sum(W * X[l])) # 4.797813327299302e+51
sum_b = np.sum(np.exp(np.sum(W * X))) # 1.7199742630376623e+61
为什么会这样,在第二种情况下如何使 sum_b 等于 sum_a ?我特别想使用 numpy 计算总和,这样我就可以向量化更大的方程。
最佳答案
这些不是相同的操作。您希望 e**119 + e**22
== e**141
,但这不是求幂的工作原理。您可以使其相同,但它是乘法运算,而不是加法运算:
sum_a = 1
for l in range(len(X)):
sum_a *= np.exp(np.sum(W * X[l]))
sum_b = np.sum(np.exp(np.sum(W * X)))
顺便说一句,最后一行中的外部 np.sum
是无用的。内部 np.sum
返回单个值。
跟进
啊,所以你想要求和版本。您只需在一个轴上求和即可做到这一点:
sum_b = np.sum(np.exp(np.sum(W * X, axis=1)))
在这种特殊情况下,这是愚蠢的,因为 e**119
比 e**22
大得多,后者没有贡献。
关于python - 为什么这些 numpy 操作不等效,我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69530815/