Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
深度学习1. 基础——线性代数:标量、向量、矩阵和张量,希望能够帮助你!!!。
在介绍标量时,会明确它是哪种类型的数,如:
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。无论是在线性代数、多项式理论,还是在微积分学中(比如说换元积分法中),行列式作为基本的数学工具,都有着重要的应用。
行列式可以看做是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说,在 n 维欧几里得空间中,行列式描述的是一个线性变换对"体积"所造成的影响。
矩阵是一个二维数组,通常使用大写变量名称,如A
一个实数矩阵高m宽度n,可以表示为
A1,1 表示左上的元素
Am,n 表示右下的元素
在某些情况下,我们会讨论坐标超过两维的数组,一般的,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。我们使用字体 A 来表示张量“A"。张量A中坐标为(i,j,k) 的元素记作
.
转置是以对角线为轴的矩阵的镜像,从左上到右下称为主对角线(main diagonal)。
公式定义为:
向量可以看作只有一列的矩阵, 对应地,向量的转置可以看作只有一行的矩阵。
标量的转置等于自身。
矩阵可以进行加法、乘法计算。
深度学习中,允许矩阵和向量相加:
即向量b和矩阵A的每一行相加。这是一种隐式地复制向量b到很多位置的方式,称为广播(broadcasting)。
两个矩阵的标准乘积不是两个矩阵中对应元素的乘积。
两个矩阵 A 和 B 的矩阵乘积(matrix product)是第三个矩阵 C 。
为了使乘法可被定义,矩阵A的列数和矩阵B的行数相等。如果矩阵A的形状是 m∗n, 矩阵B BB 的形状是 m∗p , 我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法。例如:
C=AB
具体地,该乘法操作定义为
示例:
点积
两个相同维数的向量 x 和 y 的点积(dot poduct)可看作矩阵乘积
。我们可以把矩阵乘积 C=AB 中计算Ci,j 的步骤看作 A 的第 i 行和 B 的第 j 列之间的点积。
矩阵乘法分配律
A(B+C)=AB+AC
矩阵乘积结合律
A(BC)=(AB)C
矩阵乘积并不满足交换律,然而两个向量的点积满足交换律:
矩阵乘积的转置有着简单的形式:
从形式上看,单位矩阵所有沿对角线的元素都是1, 而其它位置的所有元素都是0.如:
任意向量和单位矩阵相乘,都不会改变。我们将保持n nn维向量不变的单位矩阵记作In,形式上,
矩阵 A AA 的逆矩阵记作 A − 1 A^{-1}A−1, 其定义的矩阵满足如下条件:
这取决于我们能否找到一个逆矩阵
。
当逆矩阵
存在时,有几种不同的算法都能找到它的闭解形式。理论上,相同的逆矩阵可用于多次求解不同向量 b 的议程。然而,逆矩阵
主要是作为理论工具使用的,并不会在大多数软件应用程序中实际使用。这是因为逆矩阵
在数字计算机上只能表现出有限的精度,有效使用向量 b 的算法通常可以得到更精确的x。
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])
输出结果:
import numpy as np a = 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,:])
import numpy as np a = 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)
import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) print(a) a[a>6] = 0 print(a)
import numpy as np a1 = 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 )
import numpy as np a = np.arange(10) # 默认从0开始到10(不包括10),步长为1 print(a) # 返回 [0 1 2 3 4 5 6 7 8 9] a1 = np.arange(5,10) # 从5开始到10(不包括10),步长为1 print(a1) # 返回 [5 6 7 8 9] a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2 print(a2) # 返回 [ 5 7 9 11 13 15 17 19]
import numpy as np a = np.linspace(0,10,7) # 生成首位是0,末位是10,含7个数的等差数列 print(a)
import numpy as np a = np.logspace(0,2,5) # 生成首位是10^0,末位是10^2,含5个数的等比数列 print(a)
运算符 |
说明 |
+ |
矩阵对应元素相加 |
- |
矩阵对应元素相减 |
* |
矩阵对应元素相乘 |
/ |
矩阵对应元素相除,如果都是整数则取商 |
% |
矩阵对应元素相除后取余数 |
** |
矩阵每个元素都取n次方,如**2:每个元素都取平方 |
示例:
import numpy as np a1 = 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) # 相除取余数
import numpy as np a1 = 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))
可以看到点乘不满足乘法交换率。
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.transpose()) # 或 a.T
import numpy as np import numpy.linalg as lg a = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(lg.inv(a)) a = np.eye(3) # 定义一个3阶单位矩阵 print(lg.inv(a)) # 单位矩阵的逆为他本身
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章