[预备知识] 1. 线性代数基础
线性代数基础
线性代数是深度学习的重要基础,本章节将介绍深度学习中常用的线性代数概念和操作。
1. 标量、向量、矩阵与张量
1.1 标量(Scalar)
标量是单个数值,用$ x \\in \\mathbb{R} $表示。在深度学习中常用于表示权重、偏置等参数。
import numpy as np# 创建标量x = np.array(5)# 标量运算print(\"标量加法:\", x + 3) # 5+3=8print(\"标量减法:\", x - 2) # 5-2=3print(\"标量数乘:\", 2 * x) # 2×5=10print(\"标量除法:\", x / 2) # 5/2=2.5
1.2 向量(Vector)
向量是有序的一维数组,由多个标量组成,用列向量表示:
x=[x1x2⋮xn]∈Rn\\mathbf{x} = \\begin{bmatrix} x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_n \\end{bmatrix} \\in \\mathbb{R}^nx=x1x2⋮xn∈Rn
其中,x1,x2,...,xix_1, x_2, ..., x_ix1,x2,...,xi 是向量 x\\mathbf{x}x 的元素。xix_ixi表示向量的第iii个元素。
在代码中,可以使用下标索引来访问向量的元素:
# 创建列向量(推荐显式声明二维结构)x_col = np.array([[1], [2], [3]]) # 3×1列向量x_row = np.array([1, 2, 3]) # 1×3行向量(严格来说是1维数组)# 向量运算print(\"向量加法:\\n\", x_col + np.array([[4], [5], [6]])) # 对应元素相加print(\"向量数乘:\\n\", 2 * x_col) # 标量乘法print(\"向量点积:\", np.dot(x_row, np.array([4, 5, 6]))) # 1×3 ⋅ 3×1 = 标量
1.3 矩阵(Matrix)
矩阵是二维数组,由多个向量组成,用大写字母表示:
A=[a11a12a21a22]∈Rm×nA = \\begin{bmatrix} a_{11} & a_{12} \\\\a_{21} & a_{22} \\end{bmatrix} \\in \\mathbb{R}^{m \\times n}A=[a11a21a12a22]∈Rm×n
# 创建矩阵A = np.array([[1, 2], [3, 4]]) # 2×2矩阵B = np.array([[5, 6], [7, 8]])# 矩阵运算print(\"矩阵加法:\\n\", A + B) # 对应元素相加print(\"矩阵乘法:\\n\", A @ B) # 标准矩阵乘法print(\"矩阵转置:\\n\", A.T) # 行列互换
1.4 张量(Tensor)
张量是多维数组(三维及以上),常用于表示批量数据:
X∈Rb×h×w×c\\mathcal{X} \\in \\mathbb{R}^{b \\times h \\times w \\times c}X∈Rb×h×w×c
(b:批次大小,h:高度,w:宽度,c:通道数)
# 创建三维张量(2个样本,每个样本2×2矩阵)X = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])# 张量运算print(\"张量加法:\\n\", X + 1) # 广播机制print(\"张量转置:\\n\", X.transpose((0, 2, 1))) # 交换最后两个维度
2. 矩阵运算
2.1 基本运算
-
加减法:要求相同维度
C=A+B其中cij=aij+bijC = A + B \\quad \\text{其中} \\quad c_{ij} = a_{ij} + b_{ij}C=A+B其中cij=aij+bij -
数乘:
B=kA其中bij=k⋅aijB = kA \\quad \\text{其中} \\quad b_{ij} = k \\cdot a_{ij}B=kA其中bij=k⋅aij -
矩阵乘法:A∈Rm×n,B∈Rn×pA \\in \\mathbb{R}^{m \\times n}, B \\in \\mathbb{R}^{n \\times p}A∈Rm×n,B∈Rn×p
C=AB其中cij=∑k=1naikbkjC = AB \\quad \\text{其中} \\quad c_{ij} = \\sum_{k=1}^n a_{ik}b_{kj}C=AB其中cij=k=1∑naikbkj
2.2 特殊运算
哈达玛积(Hadamard Product)
C=A⊙B其中cij=aij⋅bijC = A \\odot B \\quad \\text{其中} \\quad c_{ij} = a_{ij} \\cdot b_{ij}C=A⊙B其中cij=aij⋅bij
矩阵范数
对于矩阵 A∈Rm×nA \\in \\mathbb{R}^{m \\times n}A∈Rm×n:
- Frobenius范数:∥A∥F=∑i,jaij2\\|A\\|_F = \\sqrt{\\sum_{i,j} a_{ij}^2}∥A∥F=∑i,jaij2,它是矩阵所有元素的平方和的平方根。
- L1范数:∥A∥1=maxj∑i∣aij∣\\|A\\|_1 = \\max_j \\sum_i |a_{ij}|∥A∥1=maxj∑i∣aij∣,它是矩阵每列元素的绝对值之和的最大值。
- 谱范数(L2):∥A∥2=σmax(A)\\|A\\|_2 = \\sigma_{\\text{max}}(A)∥A∥2=σmax(A),它是矩阵的最大奇异值。
范数的作用:
- 衡量向量或矩阵的大小:范数提供了一种量化向量或矩阵 “长度” 或 “规模” 的方式,有助于比较不同向量或矩阵的大小。
- 分析算法的稳定性和收敛性:在数值分析中,范数常用于分析迭代算法的收敛性和稳定性。例如,在求解线性方程组的迭代法中,-通过分析迭代矩阵的范数可以判断算法是否收敛。
- 机器学习中的应用:在机器学习中,范数常用于正则化项,以防止模型过拟合。例如,L1正则化可以使模型的参数变得稀疏,L2正则化可以减小参数的大小,提高模型的泛化能力。
# 哈达玛积print(\"哈达玛积:\\n\", A * B)# 矩阵范数print(\"Frobenius范数:\", np.linalg.norm(A, \'fro\')) # √(1²+2²+3²+4²)=√30≈5.477print(\"L1范数:\", np.linalg.norm(A, 1)) # 最大列和:max(1+3, 2+4)=6print(\"谱范数:\", np.linalg.norm(A, 2)) # 最大奇异值≈5.464
3. 线性方程组
形如Ax=bA\\mathbf{x} = \\mathbf{b}Ax=b,其中A∈Rn×nA \\in \\mathbb{R}^{n \\times n}A∈Rn×n为系数矩阵。
解法:使用NumPy的np.linalg.solve()
A = np.array([[2, 1], [1, 3]])b = np.array([4, 5])x = np.linalg.solve(A, b)print(\"解向量:\", x) # [1. 2.]
4. 行列式与逆矩阵
4.1 行列式(Determinant)
行列式表征矩阵的可逆性:
- det(A)≠0⇔A\\text{det}(A) \\neq 0 \\Leftrightarrow Adet(A)=0⇔A可逆
- 几何意义:线性变换的缩放因子
det_A = np.linalg.det(A)print(\"行列式:\", round(det_A, 2)) # 2×3 - 1×1 = 5
4.2 逆矩阵(Inverse Matrix)
若AAA可逆,则存在A−1A^{-1}A−1满足:
A−1A=AA−1=IA^{-1}A = AA^{-1} = IA−1A=AA−1=I
inv_A = np.linalg.inv(A)print(\"逆矩阵:\\n\", inv_A)# 验证乘积接近单位矩阵print(\"验证:\\n\", np.round(A @ inv_A, 10)) # 四舍五入消除浮点误差
5. 特征值与特征向量
对矩阵A∈Rn×nA \\in \\mathbb{R}^{n \\times n}A∈Rn×n,若存在标量λ\\lambdaλ和非零向量v\\mathbf{v}v满足:
Av=λvA\\mathbf{v} = \\lambda\\mathbf{v}Av=λv
则称λ\\lambdaλ为特征值,v\\mathbf{v}v为对应的特征向量。
eigenvalues, eigenvectors = np.linalg.eig(A)print(\"特征值:\", eigenvalues) # [1.382, 3.618]print(\"特征向量:\\n\", eigenvectors)# 验证特征方程(结果应近似相等)for i in range(len(eigenvalues)): lhs = A @ eigenvectors[:, i] rhs = eigenvalues[i] * eigenvectors[:, i] print(f\"验证 {i+1}:\", np.allclose(lhs, rhs)) # 使用容差比较
应用实例:主成分分析(PCA)
数学原理
- 标准化数据:Xscaled=X−μσX_{\\text{scaled}} = \\frac{X - \\mu}{\\sigma}Xscaled=σX−μ
- 计算协方差矩阵:C=1n−1XscaledTXscaledC = \\frac{1}{n-1}X_{\\text{scaled}}^T X_{\\text{scaled}}C=n−11XscaledTXscaled
- 特征分解:C=VΛVTC = V\\Lambda V^TC=VΛVT
- 选择前kkk大特征值对应的特征向量组成投影矩阵WWW
- 降维:Xpca=XscaledWX_{\\text{pca}} = X_{\\text{scaled}}WXpca=XscaledW
from sklearn.datasets import load_irisfrom sklearn.preprocessing import StandardScaler# 加载数据iris = load_iris()X = iris.data# 标准化X_scaled = StandardScaler().fit_transform(X)# 协方差矩阵cov_matrix = np.cov(X_scaled.T)# 特征分解eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)# 按特征值降序排序sorted_idx = np.argsort(eigenvalues)[::-1]eigenvalues = eigenvalues[sorted_idx]eigenvectors = eigenvectors[:, sorted_idx]# 选择前两个主成分W = eigenvectors[:, :2]# 投影降维X_pca = X_scaled @ Wprint(\"降维数据形状:\", X_pca.shape) # (150, 2)