[预备知识]1. 线性代数基础

发布于:2025-04-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

人工智能

线性代数基础

线性代数是深度学习的重要基础,本章节将介绍深度学习中常用的线性代数概念和操作。

1. 标量、向量、矩阵与张量

1.1 标量(Scalar)

标量是单个数值,用 x ∈ R x \in \mathbb{R} xR 表示。在深度学习中常用于表示权重、偏置等参数。

import numpy as np

# 创建标量
x = np.array(5)

# 标量运算
print("标量加法:", x + 3)  # 5+3=8
print("标量减法:", x - 2)  # 5-2=3
print("标量数乘:", 2 * x)  # 2×5=10
print("标量除法:", x / 2)  # 5/2=2.5

1.2 向量(Vector)

向量是有序的一维数组,由多个标量组成,用列向量表示:

x = [ x 1 x 2 ⋮ x n ] ∈ R n \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \in \mathbb{R}^n x= x1x2xn Rn

其中, x 1 , x 2 , . . . , x i x_1, x_2, ..., x_i x1,x2,...,xi 是向量 x \mathbf{x} x 的元素。 x i x_i xi表示向量的第 i i i个元素。

在代码中,可以使用下标索引来访问向量的元素:

# 创建列向量(推荐显式声明二维结构)
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 = [ a 11 a 12 a 21 a 22 ] ∈ R m × n A = \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 ∈ R b × h × w × c \mathcal{X} \in \mathbb{R}^{b \times h \times w \times c} XRb×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 其中 c i j = a i j + b i j C = A + B \quad \text{其中} \quad c_{ij} = a_{ij} + b_{ij} C=A+B其中cij=aij+bij

  • 数乘
    B = k A 其中 b i j = k ⋅ a i j B = kA \quad \text{其中} \quad b_{ij} = k \cdot a_{ij} B=kA其中bij=kaij

  • 矩阵乘法 A ∈ R m × n , B ∈ R n × p A \in \mathbb{R}^{m \times n}, B \in \mathbb{R}^{n \times p} ARm×n,BRn×p
    C = A B 其中 c i j = ∑ k = 1 n a i k b k j C = AB \quad \text{其中} \quad c_{ij} = \sum_{k=1}^n a_{ik}b_{kj} C=AB其中cij=k=1naikbkj


2.2 特殊运算

  • 哈达玛积(Hadamard Product)
    C = A ⊙ B 其中 c i j = a i j ⋅ b i j C = A \odot B \quad \text{其中} \quad c_{ij} = a_{ij} \cdot b_{ij} C=AB其中cij=aijbij

  • 矩阵范数

    • Frobenius范数: ∥ A ∥ F = ∑ i , j a i j 2 \|A\|_F = \sqrt{\sum_{i,j} a_{ij}^2} AF=i,jaij2
    • L1范数: ∥ A ∥ 1 = max ⁡ j ∑ i ∣ a i j ∣ \|A\|_1 = \max_j \sum_i |a_{ij}| A1=maxjiaij
    • 谱范数(L2): ∥ A ∥ 2 = σ max ( A ) \|A\|_2 = \sigma_{\text{max}}(A) A2=σmax(A)
# 哈达玛积
print("哈达玛积:\n", A * B)

# 矩阵范数
print("Frobenius范数:", np.linalg.norm(A, 'fro'))  # √(1²+2²+3²+4²)=√30≈5.477
print("L1范数:", np.linalg.norm(A, 1))            # 最大列和:max(1+3, 2+4)=6
print("谱范数:", np.linalg.norm(A, 2))             # 最大奇异值≈5.464

3. 线性方程组

形如 A x = b A\mathbf{x} = \mathbf{b} Ax=b,其中 A ∈ R n × n A \in \mathbb{R}^{n \times n} ARn×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 A det(A)=0A可逆
  • 几何意义:线性变换的缩放因子
det_A = np.linalg.det(A)
print("行列式:", round(det_A, 2))  # 2×3 - 1×1 = 5

4.2 逆矩阵(Inverse Matrix)

A A A可逆,则存在 A − 1 A^{-1} A1满足:
A − 1 A = A A − 1 = I A^{-1}A = AA^{-1} = I A1A=AA1=I

inv_A = np.linalg.inv(A)
print("逆矩阵:\n", inv_A)
# 验证乘积接近单位矩阵
print("验证:\n", np.round(A @ inv_A, 10))  # 四舍五入消除浮点误差

5. 特征值与特征向量

对矩阵 A ∈ R n × n A \in \mathbb{R}^{n \times n} ARn×n,若存在标量 λ \lambda λ和非零向量 v \mathbf{v} v满足:
A v = λ v A\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)

数学原理

  1. 标准化数据: X scaled = X − μ σ X_{\text{scaled}} = \frac{X - \mu}{\sigma} Xscaled=σXμ
  2. 计算协方差矩阵: C = 1 n − 1 X scaled T X scaled C = \frac{1}{n-1}X_{\text{scaled}}^T X_{\text{scaled}} C=n11XscaledTXscaled
  3. 特征分解: C = V Λ V T C = V\Lambda V^T C=VΛVT
  4. 选择前 k k k大特征值对应的特征向量组成投影矩阵 W W W
  5. 降维: X pca = X scaled W X_{\text{pca}} = X_{\text{scaled}}W Xpca=XscaledW
from sklearn.datasets import load_iris
from 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 @ W

print("降维数据形状:", X_pca.shape)  # (150, 2)

网站公告

今日签到

点亮在社区的每一天
去签到