cost=-1.0/m*np.sum(np.dot(Y.T,np.log(A))+np.dot((1-Y).T,np.log(1-A)))
cost=-(1.0 / m) * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
为什么上面的结果是下面的两倍呀
cost=-1.0/m*np.sum(np.dot(Y.T,np.log(A))+np.dot((1-Y).T,np.log(1-A)))
cost=-(1.0 / m) * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
为什么上面的结果是下面的两倍呀
关注两个等式之间的差异在于矩阵乘法的方式和求和的位置。让我们分析一下这两个等式的区别:
首先,让我们明确一下符号的含义:
Y 是真实标签矩阵,维度为 (n, m),其中 n 是标签的数量,m 是样本的数量。A 是模型的预测矩阵,维度也是 (n, m)。np.log 表示自然对数。第一个等式是这样计算损失的:
np.dot(Y.T, np.log(A)),这实际上是将真实标签 Y 转置后与预测概率 A 相乘,然后对所有元素进行对数运算,结果是一个 (1, m) 的矩阵。np.dot((1 - Y).T, np.log(1 - A)),这实际上是将 (1 - 真实标签 Y) 转置后与 (1 - 预测概率 A) 相乘,然后对所有元素进行对数运算,结果也是一个 (1, m) 的矩阵。-m,然后对所有元素求和,得到最终的损失值。第二个等式是这样计算损失的:
Y * np.log(A),这实际上是将真实标签 Y 与预测概率 A 逐元素相乘,然后对所有元素进行对数运算,结果是一个 (n, m) 的矩阵。(1 - Y) * np.log(1 - A),这实际上是将 (1 - 真实标签 Y) 与 (1 - 预测概率 A) 逐元素相乘,然后对所有元素进行对数运算,结果也是一个 (n, m) 的矩阵。-m,然后对所有元素求和,得到最终的损失值。现在可以看到两个等式的差异了:
通常,第二种方式更常见,因为它更符合逻辑上的直观理解:计算每个样本的损失,然后求平均值。如果你希望两个等式的结果相同,你可以将第一个等式中的 -1.0/m 移到求和符号外,这样结果就会和第二个等式相同:
cost = -1.0 * (1.0 / m) * np.sum(np.dot(Y.T, np.log(A)) + np.dot((1 - Y).T, np.log(1 - A)))
这样,两个等式的结果应该是一致的。