深度学习的数学基础1.线性代数:标量、向量、矩阵和张量
https://m.toutiao.com/is/JWhm3cH/
一、标量、向量、矩阵与张量
1. 标量(scalar)
- 一个标量就是一个单独的数。标量用斜体表示。
- 标量通常使用小写变量名称。
在介绍标量时,会明确它是哪种类型的数,如:
- 定义实数标量时,可能会说: “令 s ∈ R 表示一条线的斜率”;
- 在定义自然数标量时,可能会说 “令 n ∈ N ”表示元素的数目。
2. 向量(vector)
- 一个向量是一列数,这些数是有序排列的。向量中的元素可以用 x1这样来表示 。
3. 行列式
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。无论是在线性代数、多项式理论,还是在微积分学中(比如说换元积分法中),行列式作为基本的数学工具,都有着重要的应用。
行列式可以看做是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说,在 n 维欧几里得空间中,行列式描述的是一个线性变换对'体积'所造成的影响。
4. 矩阵(matrix)
5. 张量(tensor)
二、一些运算
1. 转置(transpose)
转置是以对角线为轴的矩阵的镜像,从左上到右下称为主对角线(main diagonal)。
公式定义为:
向量可以看作只有一列的矩阵, 对应地,向量的转置可以看作只有一行的矩阵。
标量的转置等于自身。
2. 矩阵运算
矩阵可以进行加法、乘法计算。
深度学习中,允许矩阵和向量相加:
3. 矩阵乘法
两个矩阵的标准乘积不是两个矩阵中对应元素的乘积。
两个矩阵 A A A 和 B B B 的矩阵乘积(matrix product)是第三个矩阵 C C C 。
为了使乘法可被定义,矩阵 A A A的列数和矩阵 B B B的行数相等。如果矩阵 A A A的形状是 m ∗ n m*n m∗n, 矩阵 B B B 的形状是 m ∗ p m*p m∗p , 我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法。例如:
具体地,该乘法操作定义为
示例:
元素对应乘积(Hadamard乘积)
如果是元素对应乘积(element-wise product)或者Hadamard乘积,记为 : [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6oVQitIc-1607997146629)(https://wikimedia.org/api/rest_v1/media/math/render/svg/c341d3106d2763836b32f992b74e73f4cef0d24d)]
点积
矩阵乘法分配律
矩阵乘积结合律
矩阵乘积并不满足交换律,然而两个向量的点积满足交换律:
矩阵乘积的转置有着简单的形式:
4. 单位矩阵(identity matrix)
从形式上看,单位矩阵所有沿对角线的元素都是1, 而其它位置的所有元素都是0.如:
5. 逆矩阵
6. 求解 A x = b
三、使用Python Numpy进行一些矩阵定义
1. 矩阵定义与矩阵形状
import numpy as np# 创建一维的narray对象a = np.array([1,2,3,4,5])# 创建二维的narray对象a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])print(a)print(a2)# 打印a2的形状print(a2.shape)# 行数print(a2.shape[0])# 列数print(a2.shape[1])
输出结果:
2. 矩阵的截取
import numpy as npa = np.array([[1,2,3,4,5],[6,7,8,9,10]])# 截取第一行,返回 [[1 2 3 4 5]]print(a[0:1]) # 截取第二行,第三到六列,返回 [8 9 10]print(a[1,2:5]) # 截取第二行,返回 [ 6 7 8 9 10]print(a[1,:])
3. 按条件截取
import numpy as npa = np.array([[1,2,3,4,5],[6,7,8,9,10]])# 截取矩阵a中大于6的元素,范围的是一维数组 返回 [ 7 8 9 10]b = a[a>6] print(b) # 通过布尔语句生成一个布尔矩阵(其次将布尔矩阵传入[](方括号)实现上面截取运算)print(a>6)
4. 条件截取后赋值
import numpy as npa = np.array([[1,2,3,4,5],[6,7,8,9,10]])print(a)a[a>6] = 0print(a)
5. 矩阵合并
import numpy as npa1 = np.array([[1,2],[3,4]])a2 = np.array([[5,6],[7,8]])#参数传入时要以列表list或元组tuple的形式传入# 横向合并print(np.hstack([a1,a2])) # 或 np.concatenate( (a1,a2), axis=1 )# 纵向合并print(np.vstack((a1,a2))) # 或 np.concatenate( (a1,a2), axis=0 )
6. 通过函数创建矩阵
arange 递增矩阵
import numpy as npa = np.arange(10) # 默认从0开始到10(不包括10),步长为1print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]a1 = np.arange(5,10) # 从5开始到10(不包括10),步长为1print(a1) # 返回 [5 6 7 8 9]a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2print(a2) # 返回 [ 5 7 9 11 13 15 17 19]
linspace 等差数列
import numpy as npa = np.linspace(0,10,7) # 生成首位是0,末位是10,含7个数的等差数列print(a)
logspace 等比数列
import numpy as npa = np.logspace(0,2,5) # 生成首位是10^0,末位是10^2,含5个数的等比数列print(a)
其它特殊矩阵
- ones 全1矩阵
- zeros 全0矩阵
- eye 单位矩阵
- empty 全空矩阵(未初始化值状态,值不可预测)
- fromstring 从字符串转ndarray对象
- fromfunction 通过函数生成矩阵元素,可指定每个元素的生成算法
四、Python Numpy里一些矩阵运算
1. 基础运算
运算符说明+矩阵对应元素相加-矩阵对应元素相减*矩阵对应元素相乘/矩阵对应元素相除,如果都是整数则取商%矩阵对应元素相除后取余数**矩阵每个元素都取n次方,如**2:每个元素都取平方
示例:
import numpy as npa1 = np.array([[4,5,6],[1,2,3]])a2 = np.array([[6,5,4],[3,2,1]])print(a1+a2) # 相加print(a1/a2) # 整数相除取商print(a1%a2) # 相除取余数
2. 一些运算函数
- np.sin(a) 每个元素取正弦
- np.cos(a) 每个元素取余弦
- np.tan(a) 每个元素取正切
- np.arcsin(a) 每个元素取反正弦
- np.arccos(a) 每个元素取反余弦
- np.arctan(a) 每个元素取反正切
- np.exp(a) 每个元素取指数函数, e x e^x ex
- np.sqrt(a) 每个元素开根号√x
3. 矩阵乘法(点乘) dot
import numpy as npa1 = np.array([[1,2,3],[4,5,6]]) # a1为2*3矩阵a2 = np.array([[1,2],[3,4],[5,6]]) # a2为3*2矩阵print(a1.shape[1]==a2.shape[0]) # True, 满足矩阵乘法条件,即第一个矩阵的列数等于第二个矩阵的行数print(a1.dot(a2)) print(a2.dot(a1))
可以看到点乘不满足乘法交换率。
4. 矩阵转置
import numpy as npa = np.array([[1,2,3],[4,5,6]])print(a.transpose())# 或 a.T
5. 逆矩阵
import numpy as npimport numpy.linalg as lga = np.array([[1,2,3],[4,5,6],[7,8,9]])print(lg.inv(a))a = np.eye(3) # 定义一个3阶单位矩阵print(lg.inv(a)) # 单位矩阵的逆为他本身
6. 统计函数
- 最大值、最小值: a.max()
- 平均值: a.mean()
- 方差: a.var()
- 标准差:a.std()
- 中值: np.median(x)
- 求和:a.sum()
- 累积和: a.cumsum()