使用求和与点积进行矢量化

时间:2018-08-14 05:30:07

标签: numpy

我正在为一个简单的神经网络编写一个简单的线性回归成本函数(Python)。我遇到了以下两种使用numpy(np)矩阵求和m个示例的错误(成本)的方法。

成本函数是:

def compute_cost(X, Y, W):
m = Y.size;
H = h(X,W)
error = H-Y
J = (1/(2*m)) *  np.sum(error **2, axis=0) #1 (sum squared error over m examples)
return J

X是输入矩阵。 Y是输出矩阵(标签)。 W是权重矩阵。

似乎声明:

J = (1/(2*m)) *  np.sum(error **2, axis=0) #1 (sum squared error over m examples)

可以替换为:

J = (1/(2*m)) * np.dot(error.T, error) #2

具有相同的结果。

我不明白为什么np.dot等同于对m个示例求和,或者为什么两个语句给出相同的结果。您能否提供一些线索,也可以指向一些链接,使我可以阅读更多并理解np.sum和np.dot之间的这种关系。

1 个答案:

答案 0 :(得分:0)

没有什么特别的,只是简单的线性代数。

根据numpy documentationnp.dot(a,b)对不同类型的输入执行不同的操作。

  

如果a和b都是一维数组,则它是向量的内积   (没有复杂的共轭)。

     

如果a和b都是二维数组,则为   矩阵乘法,但最好使用matmul或a @ b。

如果您的error是一维数组,那么转置error.T等于error,则操作np.dot是它们的内积,等于每个元素的总和等于2的幂。

如果您的error是二维数组,则应遵循矩阵乘法原理,因此error.T的每一行都将与error的每一列相乘。当您的error是列向量时,结果将是1 * 1矩阵,类似于标量。如果您的error是1×N行向量,则它会返回N×N矩阵。