我正在为一个简单的神经网络编写一个简单的线性回归成本函数(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之间的这种关系。
答案 0 :(得分:0)
没有什么特别的,只是简单的线性代数。
根据numpy documentation,np.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矩阵。