jyxjy 2023-10-08 09:51 采纳率: 0%
浏览 3

numpy运算的问题

 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))       

为什么上面的结果是下面的两倍呀

  • 写回答

3条回答 默认 最新

  • IT小辉同学 优质创作者: Java技术领域 2023-10-08 11:24
    关注

    两个等式之间的差异在于矩阵乘法的方式和求和的位置。让我们分析一下这两个等式的区别:

    首先,让我们明确一下符号的含义:

    • Y 是真实标签矩阵,维度为 (n, m),其中 n 是标签的数量,m 是样本的数量。
    • A 是模型的预测矩阵,维度也是 (n, m)。
    • np.log 表示自然对数。

    第一个等式是这样计算损失的:

    1. 计算 np.dot(Y.T, np.log(A)),这实际上是将真实标签 Y 转置后与预测概率 A 相乘,然后对所有元素进行对数运算,结果是一个 (1, m) 的矩阵。
    2. 计算 np.dot((1 - Y).T, np.log(1 - A)),这实际上是将 (1 - 真实标签 Y) 转置后与 (1 - 预测概率 A) 相乘,然后对所有元素进行对数运算,结果也是一个 (1, m) 的矩阵。
    3. 将上述两个矩阵相加,并除以 -m,然后对所有元素求和,得到最终的损失值。

    第二个等式是这样计算损失的:

    1. 计算 Y * np.log(A),这实际上是将真实标签 Y 与预测概率 A 逐元素相乘,然后对所有元素进行对数运算,结果是一个 (n, m) 的矩阵。
    2. 计算 (1 - Y) * np.log(1 - A),这实际上是将 (1 - 真实标签 Y) 与 (1 - 预测概率 A) 逐元素相乘,然后对所有元素进行对数运算,结果也是一个 (n, m) 的矩阵。
    3. 将上述两个矩阵逐元素相加,然后除以 -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)))
    

    这样,两个等式的结果应该是一致的。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月8日