向量、矩阵、特征值分解

前言

线性代数是机器学习的数学基石。无论是数据表示、模型参数还是特征变换,都离不开向量和矩阵运算。本文将梳理机器学习中最常用的线性代数概念。


向量基础

什么是向量

向量是有大小和方向的量,在机器学习中通常表示为一列数字:

\[\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 许可协议进行授权)

本文标题:《 机器学习基础系列——数学基础:线性代数 》

本文链接:http://localhost:3015/ai/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80-%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!