最终结果如下:
一、What
1.1 矩阵乘积
矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型,如电力系统网络模型。
https://baike.baidu.com/item/矩阵乘法/5446029?fr=aladdin
二、Why
学AI知识要用。
三、How
3.1 一维数组
对一维数组来说,其实就是∑a[n]b[n]
import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(suppress=True,precision=12,)
def f3(a1):
print(a1)
plt.plot(a1,'k-o')
plt.show()
a1=np.arange(1,4)
f3(a1)
matplotlib.pyplot用于画图,set_printoptions中suppress=True用于取消科学计数法,即不使用1.23e4(1.23*10^4)这种表达方式,免得让人疑惑,precision=12表示取小数点后12位
f3是一个函数 ,主要用于输入一个 数或数组,打印内容 ,并显示出来。
使用np.arange生成一个数组,打印并绘制出来 (编译器使用 JupyterLab)
可以看到生成一条线段,一共有三个点,分别是(0,1),(1,2),(2,3),数组的x轴默认为0,1,2……,y轴为数组对应的值
将数组倒置一下,变成反过来的样子
a2=a1[::-1]
f3(a2)
PS:[::-1]这种写法实际上省略了两个参数,意思是将整个数组倒置
[a:b:c]中a表示取这个数组的第a位为起点 ,b表示取这个数组的第b位为终点,c表示步进,即每次加多少,如[2:10:2],表示取下标2到下标9的数,每次下标要加2。当步进为负数时表示反向取值,当不写参数时,表示取默认值。
然后我们来看看dot的使用,在一维数组中,就是求∑a[n]b[n],
# 其实就是∑a[n]b[n]
a=np.dot(a1,a2)
print(a)
# 即1*3+2*2+3*1
直接输出了一个整数10,这个数等于相同下标数乘积之和。
3.2 二维数组
接下来我们看二维数组
3.2.1 2x2二维数组的矩阵乘积
二维数组使用reshape函数生成,直接指定数组的形状,比如生成一个2*2的二维数组,取值范围从-2到2,注意,所取范围一定要等于reshape参数的乘积,比如-2~2一共有-2,-1,0,1四个数,生成的矩阵是
[[-2 -1]
[0 1]]
可以看到上面的图像是两条短直线,实际上二维数组在输出图像时,是以某个列为一条曲线,比如第一列-2和0,就组成下面的线段。
然后我们再设置一个数组,这次范围从1-5
然后用dot函数去运算,看结果是什么(全文核心)
说实话这个矩阵乘积的算法一开始看着的确让人费解,但是简单描述一点,就是行乘列,前面的行乘后面的列,结果数组的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
3.2.2 2x10二维数组与10x3二维数组的矩阵乘积
我们把数据范围加大,设置一个两行十列,20个数据的二维数组
w4=np.arange(1,21).reshape(2,10)
f3(w4)
10个列就有10条线段
再设置一个10行3列的数组(为什么不用10*2?为了在后面得到数据形状的时候更好的说明新数组的行与列是继承于哪一个数组)
相乘结果如下:
得到一个2*3的数组,行数取决于第一个数组,列数取决于第二个数组
3.2.3 10x2二维数组与2x11二维数组的矩阵乘积
使数据增多,才可以看到矩阵乘积对原始数据的影响。
先定义一个10行2列的二维数组
然后设置一个2行11列的二维数组
再求他们的矩阵积
到这里你应该明白矩阵乘积形状变化的规律了,AxB与 CxD,靠近的数(BC)要一样,两头的数,头做行(A)。尾做列(D)。