首先我们要明白的一点是在Python中的乘法分为矩阵点乘和矩阵相乘,其实根据字面意思就能够知道两者的区别。首先我们看下在课程中吴教授用英文的解释
Recall that “np.dot(a,b)” performs a matrix multiplication on a and b, whereas “a*b” performs an element-wise multiplication.
首先看下英文的解释
In numpy the “*” operator indicates element-wise multiplication
解释:
将同位置的元素进行相乘
[a,b] + [e,f] = [ ae, bf ]
c,d g,h cg, dh
使用条件:
同型的矩阵,即行数列数要相等,或者满足广播机制的general principal。
何为general principal?
虽然课堂上有讲,但我这里还是稍微总结一下。
如果两个数组的后缘维度的轴长度相符或其中一方的轴长度为1,则它们是广播兼容的。
后缘维度的轴长度说人话就是矩阵维度的最后一个位置的值,如A(b,c)则后缘长度为c
所以最常见的符合general principal的有三种情况,分别是
1.A(m,n)和B(1,n)
符合后缘维度的轴长度相符的条件,对B进行广播
2.A(m,n)和B(m,1)
符合其中一方的轴长度为1的条件,对B进行广播
3.A(m,n)和B(1,1) 也就是B为常数
符合其中一方的轴长度为1的条件,对B进行广播
使用方法:
如果你用的是np.array定义的,那么点乘直接用a*b或者np.multiply(a,b)即可
如果用np.mat定义,那么只能用np.multiply(a,b)
同理先看下英文解释
remember that a np.dot(a, b) has shape (number of rows of a, number of columns of b). The sizes match because :
“number of columns of a = number of rows of b”
也就是说矩阵相乘的条件要比点乘严格很多!
解释:
矩阵相乘所得到的数组中的每个元素为原第一个矩阵中该元素行号相同的元素与第二个矩阵该元素列号相同的元素两两相乘后再求和。
按照我的理解说人话,就是下面的解释。
因为我们首先需要知道的是矩阵相乘存在的意义是什么,是为了简化运算,回顾一下在我们计算预测值的时候,我们要用到式子
a = w1*x1 + w2*x2 + ...... + wn*xn
如果不用矩阵相乘,那我们就只能写一个for循环从1一直加到n
如果采用矩阵相乘,一行代码就可以了。
[X1,X2] + [W1] = [ X1W1+X2W2 ]
W2
根据上面的图示是不是就有了一个直观的感受?就是将第二个矩阵的列与第一个矩阵的行相乘并相加。如果有更多呢?那就是
[X1,X2] + [W1,W3] = [ X1W1+X2W2, X1W3+X1W4 ]
Y1,Y2 W2,W4 Y1W1+Y2W2, Y1W3+Y2W4
根据上面的实例我们又可以直观的感受矩阵相乘的另一个优点就体现在多组数据的统一格式化操作,上方不但计算了
a = w1*x1 + w2*x2 + ...... + wn*xn
还计算了
b = w1*y1 + w2*y2 + ...... + wn*yn
所以我们可以把矩阵相乘的操作看成以第一个矩阵的行为标准,在第一个矩阵一行行向下移动操作的时候,对第二个矩阵的一列一列进行移动操作,具体操作就是将第二个矩阵的列与第一个矩阵的行相乘并相加。
使用条件:
上面也强调过矩阵相乘要比点乘更加严格,具体体现就是第一个矩阵的列数要等于第二个矩阵的行数,否则无法计算会进行报错。
使用方法:
如果你用的是np.array定义的,那么只能用np.dot(a,b)
如果用np.mat定义,那么直接用a*b或者np.dot(a,b)即可