最近在作编程练习,发现有些结果的值与答案相差较大,经过分析比较得出结论,大概过程以下:python
定义了一个计算损失的函数:编程
def error(yhat,label): yhat = np.array(yhat) label = np.array(label) error_sum = ((yhat - label)**2).sum() return error_sum主要出现问题的是 yhat - label 部分,要强调的是必定要保证二者维度是相同的!这点很重要,不然就会按照python的广播机制进行运算,举个例子:
a = np.array([1,2,3]) a0 = np.array([[1],[2],[3]]) b = np.array([2,3,5,]) print(b-a) print(b-a0)
这里a的维度是(3,),由于是由列表转化成的数组(固然不是很推荐这种维度,由于很容易犯错),a0的维度是(3,1),b的维度是(3,),a与b的维度相同,在计算b-a的时候,结果显而易见:数组
b - a0 的结果:函数
产生这种结果的缘由是由于因为维度不一样,在计算的时候将b变为了与a0一样的3行的数组,变化后b的维度变为了(3,3),等同于以下的计算:3d
b = np.array([[2,3,5], [2,3,5], [2,3,5]]) a0 = np.array([[1], [2], [3]]) b - a0
结果仍然为:code