向量、矩阵、特征值分解
前言
线性代数是机器学习的数学基石。无论是数据表示、模型参数还是特征变换,都离不开向量和矩阵运算。本文将梳理机器学习中最常用的线性代数概念。
向量基础
什么是向量
向量是有大小和方向的量,在机器学习中通常表示为一列数字:
\[\mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}\]向量运算
加法与标量乘法:
import numpy as np
# 向量定义
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 加法
c = a + b # [5, 7, 9]
# 标量乘法
d = 2 * a # [2, 4, 6]
点积(内积):
\[\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i = |\mathbf{a}||\mathbf{b}|\cos\theta\]# 点积
dot_product = np.dot(a, b) # 1*4 + 2*5 + 3*6 = 32
# 或使用 @ 运算符
dot_product = a @ b
向量范数
范数衡量向量的”大小”:
| 范数 | 公式 | 含义 | ||
|---|---|---|---|---|
| L1范数 | $|\mathbf{x}|_1 = \sum_i | x_i | $ | 曼哈顿距离 |
| L2范数 | $|\mathbf{x}|_2 = \sqrt{\sum_i x_i^2}$ | 欧几里得距离 | ||
| L∞范数 | $|\mathbf{x}|_\infty = \max_i | x_i | $ | 最大绝对值 |
x = np.array([3, -4])
l1_norm = np.linalg.norm(x, ord=1) # 7
l2_norm = np.linalg.norm(x, ord=2) # 5
linf_norm = np.linalg.norm(x, ord=np.inf) # 4
矩阵基础
矩阵表示
矩阵是二维数组,常用于表示数据集或线性变换:
\[\mathbf{A} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix}\]矩阵运算
矩阵乘法:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
C = A @ B # 或 np.dot(A, B)
# [[19, 22],
# [43, 50]]
# 逐元素乘法(Hadamard积)
D = A * B
# [[ 5, 12],
# [21, 32]]
转置:
A_T = A.T
# [[1, 3],
# [2, 4]]
特殊矩阵
| 矩阵类型 | 特点 | 应用 |
|---|---|---|
| 单位矩阵 $\mathbf{I}$ | 对角线为1,其余为0 | 恒等变换 |
| 对角矩阵 | 只有对角线非零 | 缩放变换 |
| 对称矩阵 | $\mathbf{A} = \mathbf{A}^T$ | 协方差矩阵 |
| 正交矩阵 | $\mathbf{A}^T\mathbf{A} = \mathbf{I}$ | 旋转变换 |
# 单位矩阵
I = np.eye(3)
# 对角矩阵
D = np.diag([1, 2, 3])
# 检查对称性
A = np.array([[1, 2], [2, 1]])
is_symmetric = np.allclose(A, A.T) # True
矩阵分解
特征值分解
对于方阵 $\mathbf{A}$,如果存在标量 $\lambda$ 和非零向量 $\mathbf{v}$ 满足:
\[\mathbf{A}\mathbf{v} = \lambda\mathbf{v}\]则 $\lambda$ 是特征值,$\mathbf{v}$ 是特征向量。
A = np.array([[4, 2], [1, 3]])
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"特征值: {eigenvalues}") # [5., 2.]
print(f"特征向量:\n{eigenvectors}")
应用场景:
- PCA降维
- 图的谱聚类
- 协方差矩阵分析
奇异值分解(SVD)
任意矩阵都可以分解为:
\[\mathbf{A} = \mathbf{U}\mathbf{\Sigma}\mathbf{V}^T\]A = np.array([[1, 2], [3, 4], [5, 6]])
U, S, Vt = np.linalg.svd(A)
print(f"U shape: {U.shape}") # (3, 3)
print(f"S: {S}") # 奇异值
print(f"Vt shape: {Vt.shape}") # (2, 2)
# 重构矩阵
A_reconstructed = U[:, :2] @ np.diag(S) @ Vt
应用场景:
- 推荐系统
- 图像压缩
- 降维
线性方程组
求解线性方程组
\[\mathbf{A}\mathbf{x} = \mathbf{b}\]A = np.array([[2, 1], [1, 3]])
b = np.array([4, 5])
# 精确解
x = np.linalg.solve(A, b)
print(f"解: {x}") # [1., 1.33...]
# 最小二乘解(超定方程组)
A = np.array([[1, 1], [2, 1], [3, 1]])
b = np.array([2, 3, 4])
x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
矩阵的逆
A = np.array([[1, 2], [3, 4]])
# 计算逆矩阵
A_inv = np.linalg.inv(A)
# 验证
print(A @ A_inv) # 约等于单位矩阵
# 判断是否可逆(行列式不为0)
det = np.linalg.det(A)
print(f"行列式: {det}") # -2.0
在机器学习中的应用
线性回归的矩阵形式
正规方程:
\[\mathbf{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y}\]# 生成数据
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]]) # 含偏置项
y = np.array([2, 4, 5, 4])
# 正规方程求解
w = np.linalg.inv(X.T @ X) @ X.T @ y
print(f"权重: {w}") # [偏置, 斜率]
协方差矩阵
\[\mathbf{C} = \frac{1}{n-1}(\mathbf{X} - \bar{\mathbf{X}})^T(\mathbf{X} - \bar{\mathbf{X}})\]# 数据矩阵
X = np.array([[1, 2], [3, 4], [5, 6]])
# 计算协方差矩阵
cov_matrix = np.cov(X.T)
print(f"协方差矩阵:\n{cov_matrix}")
常见问题
Q1: 为什么矩阵乘法不满足交换律?
矩阵乘法表示线性变换的复合。两个变换的顺序通常会影响最终结果,就像”先旋转再平移”和”先平移再旋转”结果不同。
Q2: 特征值有什么直观含义?
特征向量表示变换的”主方向”,特征值表示在该方向上的缩放因子。例如,协方差矩阵的最大特征值方向就是数据方差最大的方向(PCA的第一主成分)。
Q3: 什么时候用SVD而不是特征值分解?
- 特征值分解只适用于方阵
- SVD适用于任意形状的矩阵
- SVD数值更稳定
Q4: 如何处理奇异矩阵?
奇异矩阵不可逆,可以使用:
- 伪逆(Moore-Penrose逆):
np.linalg.pinv(A) - 正则化:添加小量对角项 $\mathbf{A} + \epsilon\mathbf{I}$
总结
| 概念 | 核心公式 | ML应用 |
|---|---|---|
| 点积 | $\mathbf{a} \cdot \mathbf{b}$ | 相似度计算 |
| 范数 | $|\mathbf{x}|_p$ | 正则化 |
| 矩阵乘法 | $\mathbf{C} = \mathbf{AB}$ | 线性变换 |
| 特征分解 | $\mathbf{Av} = \lambda\mathbf{v}$ | PCA |
| SVD | $\mathbf{A} = \mathbf{U\Sigma V}^T$ | 降维、推荐 |
掌握这些基础概念,后续学习各种机器学习算法时会更加得心应手。
参考资料
- Gilbert Strang《Linear Algebra and Its Applications》
- 3Blue1Brown《线性代数的本质》视频系列
- NumPy 官方文档:numpy.linalg
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:《 机器学习基础系列——数学基础:线性代数 》
本文最后一次更新为 天前,文章中的某些内容可能已过时!