如何在不使用循环的情况下使用NumPy在Python中逐行应用均方误差

问题描述

我正在构建一个原始的神经网络来模拟与门。损失函数是MSE:

def mse(predicted,desired): 
    return np.square(np.subtract(predicted,desired)).mean()

以下是预测所需输出(又称标签):

predicted = np.array
    ([[0.5000,0.5000],# 0 AND 0
      [0.4721,0.5279],# 0 AND 1
      [0.3049,0.6951],# 1 AND 0
      [0.3345,0.6655]])  # 1 AND 1

desired = np.array
    ([[1,0],# False
      [1,# False
      [0,1]])  # True

每行(在上述两个矩阵中)都表示一种情况。我想这样将所有案例保持在一起,而不是将它们拆分为向量。问题是,我需要单独对待每一行。

我正在尝试获得以下结果,但我却没能完成

returned output = 
    [0.2500,# 1st CASE ERROR
     0.2786,# 2nd CASE ERROR
     0.4831,# 3rd CASE ERROR 
     0.1118]  # 4th CASE ERROR

我尝试了以下功能...

np.apply_along_axis(mse,1,predicted,desired)

但是它不起作用,因为“需求” 被作为整个矩阵而不是一次传递。那么,有什么方法可以在不更改“ mse函数”实现或循环的情况下实现这一目标?

解决方法

由于所有数据都以格式良好的ndarrays组成,因此您可以使NumPy承担所有繁重的工作。在这种情况下,您可以将for循环转换为沿数组维度之一的约简。

np.square(np.subtract(predicted,desired)).mean(1)

((predicted-desired)**2).mean(1)

这是更易读的IMO。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...