第2课 线性代数相关问题
矩阵
在处理数据的过程中,常用的数据结构是矩阵。在Python中,矩阵可以用而二维数组来表示。
通常情况下,矩阵用大写字母代替,如$X$,$m\times n$表示矩阵的维度,其中$m$为矩阵的行数,$n$表示矩阵的列数。
$\mathbb{R}^{m\times n}$表示所有$m\times n$实数矩阵的集合。
在矩阵$X$中,其中每个元素可以用$X_{ij}$来表示,其中该元素位于$i$表示第$i$行,$j$表示第$j$列。 在Python中,初始化矩阵可以用numpy包中的numpy.array()函数。
import numpy as np
X = np.array([(1,2,3),(4,5,6),(7,8,9)]) #手动生成一个数据
Sequence_X = np.arange(9).reshape(3,3) #按照序列生成数组
Rand_Float_X = np.random.random((3,3)) #生成一个随机浮点数组
Rand_Int_X = np.random.randint(0,10,size=[3,3]) #生成一个随机整型数组
矩阵的运算
- 加减:两个维度完全相同的矩阵,可以直接进行加减运算,运算时,两矩阵对应元素分别进行加减操作。
A+B
A-B
- 矩阵与标量的乘除:矩阵可以与标量直接进行乘除运算,并且矩阵与标量的乘法满足交换律。
A * a = a * A
A / a != a / A
- 矩阵与向量的乘法,包含两种形式
- 一种是两者的点乘,矩阵能与向量点乘的前提是,被乘对象的列树等于所乘对象的行数。
矩阵$X\in\mathbb{R}^{m\times n}$,向量$\vec{y}\in\mathbb{R}^{n\times1}$,那么
\[X\cdot\vec{y}=\begin{bmatrix}X_{11}&X_{12}&\cdots&X_{1n}\\X_{21}&X_{22}&\cdots&X_{2n}\\\vdots&\vdots&\ddots&\vdots\\X_{m1}&X_{m2}&\cdots&X_{mn}\end{bmatrix}\begin{bmatrix}y_1\\y_2\\\vdots\\y_n\end{bmatrix}=\begin{bmatrix}X_{11}y_1+X_{12}y_2+\cdots+X_{1n}y_n\\X_{21}y_1+X_{22}y2+\cdots+X_{2n}yn\\\vdots\\X_{m1}y_1+X_{m2}y2+\cdots+X_{mn}yn\end{bmatrix}\]可以看到,$\mathbb{R}^{m\times n}\cdot\mathbb{R}^{n\times 1} = \mathbb{R}^{m\times 1}$。
在Python中,矩阵与向量的点乘借助numpy包中的dot函数实现。
numpy.dot(X,y)
而$\vec{y}\cdot X$无法运算。
- 另一种情况是元素分别相乘,如果向量的元素数量能够与矩阵的某一个维度相等,则二者可以按照此相同维度进行元素乘法。
(1)如果矩阵$X\in\mathbb{R}^{m\times n}$,向量$\vec{y}\in\mathbb{R}^{n\times1}$,那么
\[\begin{aligned} y^T*X = X*y^T&=\begin{bmatrix}X_{11}&X_{12}&\cdots&X_{1n}\\X_{21}&X_{22}&\cdots&X_{2n}\\\vdots&\vdots&\ddots&\vdots\\X_{m1}&X_{m2}&\cdots&X_{mn}\end{bmatrix}\begin{bmatrix}y_1&y_2&\cdots&y_n\end{bmatrix}\\ &=\begin{bmatrix}X_{11}y_1&X_{12}y_2&\cdots&X_{1n}y_n\\X_{21}y_1&X_{22}y2&\cdots&X_{2n}y_n\\\vdots&\vdots&\ddots&\vdots\\X_{m1}y_1&X_{m2}y2&\cdots&X_{mn}y_n\end{bmatrix} \end{aligned}\](2) 如果矩阵$X\in\mathbb{R}^{m\times n}$,向量$\vec{y}\in\mathbb{R}^{m\times1}$,那么
\[y*X = X*y=\begin{bmatrix}X_{11}&X_{12}&\cdots&X_{1n}\\X_{21}&X_{22}&\cdots&X_{2n}\\\vdots&\vdots&\ddots&\vdots\\X_{m1}&X_{m2}&\cdots&X_{mn}\end{bmatrix}\begin{bmatrix}y_1\\y_2\\\cdots\\y_m\end{bmatrix}=\begin{bmatrix}X_{11}y_1&X_{12}y_1&\cdots&X_{1n}y_1\\X_{21}y_2&X_{22}y_2&\cdots&X_{2n}y_2\\\vdots&\vdots&\ddots&\vdots\\X_{m1}y_m&X_{m2}y_m&\cdots&X_{mn}y_m\end{bmatrix}\]在Python中,可以直接用*符号进行运算。
X * y
- 矩阵的乘法,包含两种形式:
-
矩阵的点乘:能够进行点乘运算的两矩阵至少有一个维度相等。
$\mathbb{R}^{m\times n}\cdot\mathbb{R}^{n\times p} = \mathbb{R}^{m\times p}$
假设$P=X\cdot Y$
那么$P_{ij} = \sum_{r=1}^nX_{ir}Y_{rj}=X_{i1}Y_{1j}+X_{i2}Y_{2j}+\cdots+X_{in}Y_{nj}$
#在Python中,可以利用numpy包的dot函数进行矩阵的点乘。 numpy.dot(X,Y)
矩阵的点乘运算满足以下性质:
- 结合律:$A\cdot(B\cdot C) = (A \cdot B)\cdot C$
- 矩阵$X$与单位阵的点积“满足”交换律:
$A_{m \times n}\cdot I_{n\times n}=I_{m\times m}\cdot A_{m\times n}$
-
矩阵的元素相乘:如果两个矩阵的维度完全相同,可以进行按元素相乘的运算。在Python中,可以直接利用*进行矩阵元素乘法运算。
-
-
矩阵的逆运算:
矩阵可逆的前提之一是矩阵本身为方阵。不可逆的矩阵为奇异矩阵(退化矩阵)。 $A\cdot A^{-1}=A^{-1}\cdot A= I$
# 如果A为方阵,可以利用numpy包求解矩阵的逆 invA = np.linalg.inv(A)