查看全课大纲(第 3 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

矩阵与张量

约 19 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

在上一节我们学习了向量的概念与运算,它们是描述高维空间中单个数据点的基本工具。然而,现实世界的数据往往是成批出现的,例如一个班级所有学生的成绩,或是一张图片的所有像素。为了高效地组织和处理这些批量数据,我们需要引入矩阵和张量。本节将系统讲解矩阵的定义、运算及其转置,并深入探讨张量这一更高维度的数据结构,理解它们在描述复杂数据(如图像、物理应力场)中的核心作用。

💡 核心导读

  • 矩阵是向量的集合:理解矩阵是多个列向量(或行向量)的并排放置,是数据集的天然表示形式。
  • 转置是视角的转换:掌握矩阵转置的操作与几何意义,它是连接行向量与列向量的桥梁。
  • 数据的高维表示:学习如何用矩阵表示图像、用户特征等实际数据,明确维度(n)与样本量(N)的数学记号。
  • 张量是矩阵的推广:从向量(一阶张量)、矩阵(二阶张量)到更高阶张量,理解其作为描述多维关系(如物体受力)的强大工具。

从向量到矩阵

一个向量可以看作是一个特殊的矩阵。当我们把多个向量并排放置时,就构成了一个矩阵。

矩阵的定义与表示

顺带一提历史:矩阵这个概念最早正是在求解多项式方程组的过程中发展起来的,后来才成为高等数学与机器学习中无处不在的基础结构。

一个 m×nm \times n 的矩阵 AA 有 mm 行(row)和 nn 列(column),其元素可以表示为: A=[a11a12⋯a1na21a22⋯a2n⋮⋮⋱⋮am1am2⋯amn]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} 其中 aija_{ij} 表示位于第 ii 行、第 jj 列的元素。

向量的默认形式 在数学和机器学习中,有一个重要的约定:

  • 列向量是默认形式:当我们说“给定一个向量 x\mathbf{x}”时,如果没有特别说明,通常默认它是一个列向量,即 x∈Rn×1\mathbf{x} \in \mathbb{R}^{n \times 1}。
  • 行向量是列向量的转置:行向量可以表示为列向量的转置,记作 xT\mathbf{x}^T。

这个约定影响了运算的写法。例如,向量与自身的点积(内积)表示为: xTx=∑i=1nxi2\mathbf{x}^T \mathbf{x} = \sum_{i=1}^{n} x_i^2 这里,xT\mathbf{x}^T 是 1×n1 \times n 的行向量,x\mathbf{x} 是 n×1n \times 1 的列向量,两者相乘得到一个标量。

# 示例:向量点积计算
def dot_product(v1, v2):
    """计算两个向量的点积(内积)"""
    if len(v1) != len(v2):
        raise ValueError("Vectors must have the same length")
    return sum(x * y for x, y in zip(v1, v2))

# 定义列向量(用列表表示)
x = [1, 2, 3]
# 其转置(行向量)在运算中体现为参与点积的方式
# 计算 x^T * x
result = dot_product(x, x)
print(f"向量 x = {x}")
print(f"x^T * x = {result}")
向量 x = [1, 2, 3]
x^T * x = 14

矩阵的转置 矩阵的转置操作是将矩阵的行和列互换。对于一个 m×nm \times n 的矩阵 AA,其转置 ATA^T 是一个 n×mn \times m 的矩阵,满足 (AT)ij=Aji(A^T)_{ij} = A_{ji}。

例如,一个 2×32 \times 3 的矩阵转置后变为 3×23 \times 2 的矩阵。

# 示例:矩阵转置
def transpose(matrix):
    """返回矩阵的转置"""
    # 使用列表推导式实现转置
    return [[row[i] for row in matrix] for i in range(len(matrix[0]))]

A = [[1, 2, 3],
     [4, 5, 6]]  # 2行3列
A_T = transpose(A)  # 转置后为3行2列
print("原矩阵 A (2x3):")
for row in A:
    print(row)
print("\n转置矩阵 A^T (3x2):")
for row in A_T:
    print(row)
原矩阵 A (2x3):
[1, 2, 3]
[4, 5, 6]

转置矩阵 A^T (3x2):
[1, 4]
[2, 5]
[3, 6]

矩阵:数据的组织方式

矩阵之所以在机器学习中至关重要,是因为它是组织和表示数据集的天然结构。

单个数据点:高维向量 在机器学习中,一个数据点(例如一个用户、一张图片、一篇文章)通常用一个高维向量表示,这个向量的每个维度对应一个特征(feature)。

例如,描述“秦同学”的向量可能是: x秦=[身高(173),体重(80),发色(黑),学位(PhD),… ]T\mathbf{x}_{\text{秦}} = [\text{身高}(173), \text{体重}(80), \text{发色}(\text{黑}), \text{学位}(\text{PhD}), \dots]^T 这里每个维度(身高、体重等)代表一个特征,向量 x秦∈Rn\mathbf{x}_{\text{秦}} \in \mathbb{R}^n,其中 nn 是特征的个数,也称为维度(dimension)。

整个数据集:矩阵 当我们有多个数据点时,例如 NN 个学生,我们可以将每个学生的特征向量作为一列,堆叠起来形成一个矩阵 DD: D=[x1,x2,…,xN]D = [\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_N] 其中 xi∈Rn\mathbf{x}_i \in \mathbb{R}^n。这样,矩阵 DD 的形状就是 n×Nn \times N(如果向量是列向量)。每一列是一个样本,每一行是一个特征在所有样本上的取值。

统一的数学记号 在本课程中,我们采用以下记号以保持清晰:

  • 小写 nn:表示单个数据点的维度(dimension),即特征的个数。
  • 大写 NN:表示数据集中样本的数量(size)。
  • 因此,数据集矩阵 DD 的维度通常是 n×Nn \times N(特征数 × 样本数)。

这种表示方法将整个数据集浓缩为一个数学对象,便于我们后续进行批量计算和模型训练。

张量:更高维度的推广

矩阵是二维的数据表格。当我们需要表示更复杂、具有更多维度的数据时,就需要引入张量(Tensor)。张量可以看作是向量和矩阵向更高维度的推广。

张量的阶(Rank)

  • 零阶张量:标量(Scalar),只是一个数字,例如温度值 55。
  • 一阶张量:向量(Vector),例如空间中的力 F=3i+7j+2k\mathbf{F} = 3\mathbf{i} + 7\mathbf{j} + 2\mathbf{k}。它需要一组基向量(如 i,j,k\mathbf{i}, \mathbf{j}, \mathbf{k})来表示。
  • 二阶张量:矩阵(Matrix),例如描述一个立方体表面应力状态的应力张量。它需要两组基向量的组合(如 ii,ij,ji,jj\mathbf{ii}, \mathbf{ij}, \mathbf{ji}, \mathbf{jj} 等)来表示。
  • 更高阶张量:可以有三阶、四阶等,用于描述更复杂的多维关系。

从向量到张量的直观理解 考虑三维空间的标准正交基 i,j,k\mathbf{i}, \mathbf{j}, \mathbf{k}。

  • 一个向量 v=3i+7j+2k\mathbf{v} = 3\mathbf{i} + 7\mathbf{j} + 2\mathbf{k} 可以表示为相对于这组基的坐标 (3,7,2)(3, 7, 2)。这是一个一阶张量。
  • 一个二阶张量(例如应力张量)需要描述在两个方向上的作用。它可以表示为一个 3×33 \times 3 的矩阵,其每个元素 TmnT_{mn} 表示在 mm 方向平面上、沿 nn 方向的应力分量。这个矩阵的基是 ii,ij,ik,ji,…,kk\mathbf{ii}, \mathbf{ij}, \mathbf{ik}, \mathbf{ji}, \dots, \mathbf{kk} 等所有两两组合。

讲师还给了一个”同一批数据、换着形状看”的例子:64 个数,可以看作一个 64 维向量(一阶);也可以排成 8×8 的矩阵(二阶);还可以堆成 4×4×4 的立方块(三阶张量)。数据本身没变,变的是我们观察它的维度组织方式——图像处理中各卷积层”卷”出的特征面再组合起来,正是这样层层成张量的过程。

张量的应用

  1. 物理学:应力张量完美描述了物体内部任意一个微小面积元上的受力情况。这个面积元本身有方向(其法向量),施加在其上的力也有方向。二阶张量可以同时编码面积元的方向和力的方向信息,这是标量或向量无法做到的。
  2. 机器学习与深度学习:张量是处理多维数据的核心。
    • 图像数据:一张彩色图片不仅是宽度×高度的像素网格,每个像素还有RGB三个通道。因此,一张图片可以表示为一个三阶张量(高度 × 宽度 × 通道)。
    • 批量处理:在深度学习中,我们经常同时处理多张图片(一个批次),数据就变成了四阶张量(批次大小 × 高度 × 宽度 × 通道)。
    • 框架命名:著名的深度学习框架 TensorFlow,其名称直译就是“张量流”,形象地描述了计算图中张量数据的流动过程。
# 概念性示例:理解不同阶的张量表示
# 注意:此处仅为逻辑示意,展示如何用嵌套列表模拟低阶张量。

# 0阶张量:标量
scalar = 42
print(f"0阶张量(标量): {scalar}")

# 1阶张量:向量 (在3维空间)
vector = [3, 7, 2]  # 对应 3*i + 7*j + 2*k
print(f"\n1阶张量(向量): {vector}")
print("几何解释:三维空间中的一个有向线段。")

# 2阶张量:矩阵 (例如一个2x3的矩阵)
matrix = [[1, 2, 3],
          [4, 5, 6]]
print(f"\n2阶张量(矩阵): {matrix}")
print("几何解释:可以表示一种线性变换,或如应力状态等物理量。")

# 3阶张量:例如2张2x3的灰度图(模拟)
# 形状:(2, 2, 3) -> [图片数量, 高度, 宽度]
tensor_3d = [
    [[1, 2, 3], [4, 5, 6]],  # 第一张“图片”
    [[7, 8, 9], [10, 11, 12]] # 第二张“图片”
]
print(f"\n3阶张量(例如2张2x3的图片):")
for i, img in enumerate(tensor_3d):
    print(f"  图片 {i}: {img}")
print("几何解释:多个矩阵的堆叠,如一个图像批次。")
0阶张量(标量): 42

1阶张量(向量): [3, 7, 2]
几何解释:三维空间中的一个有向线段。

2阶张量(矩阵): [[1, 2, 3], [4, 5, 6]]
几何解释:可以表示一种线性变换,或如应力状态等物理量。

3阶张量(例如2张2x3的图片):
  图片 0: [[1, 2, 3], [4, 5, 6]]
  图片 1: [[7, 8, 9], [10, 11, 12]]
几何解释:多个矩阵的堆叠,如一个图像批次。

📝 动手练一练

  1. 概念辨析:假设我们有一个数据集,包含1000张128×128像素的彩色图片(RGB三通道)。请问,如果我们将整个数据集存储为一个张量,这个张量的“阶”是多少?它的形状(shape)是什么?(请用 (维度1, 维度2, ...) 的形式描述)
👉 点击查看参考答案

这是一个四阶张量。

  • 第0维(最外层):样本数量,即图片的张数,1000。
  • 第1维:图片的高度,128。
  • 第2维:图片的宽度,128。
  • 第3维:图片的颜色通道数,3(对应R, G, B)。 因此,该张量的形状是 (1000, 128, 128, 3)。 在深度学习中,我们经常用这种形状的张量来表示一个批次的图像数据。
  1. 代码实践:在讲解向量点积时,我们使用了 dot_product 函数。请编写一个函数 matrix_vector_multiply(A, v),实现矩阵 AA(m×nm \times n)与列向量 v\mathbf{v}(n×1n \times 1)的乘法,返回结果向量 b\mathbf{b}(m×1m \times 1)。请用纯Python列表操作实现,并使用一个小例子验证(例如 A=[[1,2],[3,4]]A = [[1,2],[3,4]], v=[5,6]v = [5,6])。
👉 点击查看参考答案
def matrix_vector_multiply(A, v):
    """
    计算矩阵A与列向量v的乘积。
    参数:
        A: list of lists, 表示m x n矩阵。
        v: list, 长度为n的列向量。
    返回:
        list: 长度为m的结果列向量。
    """
    m = len(A)
    n = len(A[0])
    if len(v) != n:
        raise ValueError(f"向量维度({len(v)})与矩阵列数({n})不匹配。")
    
    result = [0] * m
    for i in range(m):
        # 计算结果向量的第i个元素:A的第i行与向量v的点积
        result[i] = sum(A[i][j] * v[j] for j in range(n))
    return result

# 验证示例
A = [[1, 2],
     [3, 4]]  # 2x2矩阵
v = [5, 6]    # 2维列向量
b = matrix_vector_multiply(A, v)
print(f"矩阵 A: {A}")
print(f"向量 v: {v}")
print(f"乘积 A * v = {b}")
# 手算验证: 
# 第一行: 1*5 + 2*6 = 5+12=17
# 第二行: 3*5 + 4*6 = 15+24=39
矩阵 A: [[1, 2], [3, 4]]
向量 v: [5, 6]
乘积 A * v = [17, 39]

本章小结

本节我们深入探讨了矩阵和张量,它们是构建机器学习数学大厦的基石。

  • 矩阵 系统地组织了我们的数据,将 NN 个 nn 维样本优雅地封装在一个 n×Nn \times N 的结构中,为后续的批量计算铺平了道路。
  • 转置 操作不仅是行与列的互换,更体现了向量空间中对偶的视角,是许多公式(如内积 xTx\mathbf{x}^T\mathbf{x})得以简洁表达的关键。
  • 张量 作为向量和矩阵向高维的推广,为我们描述图像、视频、物理场等复杂、多维度关联的数据提供了统一的数学语言。理解标量、向量、矩阵、张量之间的阶次关系,是迈向深度学习等现代机器学习领域的必经之路。

📋 行动清单

学完本节,你可以立即:

  • 审视你的数据:尝试用 (特征维度 n, 样本数量 N) 的矩阵形式,在脑海中重新组织你熟悉的一个数据集(如鸢尾花数据集、房价数据)。
  • 手算验证:任取一个 2×32\times3 的小矩阵 AA 和一个三维向量 v\mathbf{v},手动计算 AvA\mathbf{v} 和 ATA^T,并与同伴或代码结果核对,巩固对矩阵运算的理解。
  • 联想应用:观察一张手机图片,思考它作为一个三阶张量(高度×宽度×通道)的具体含义,并尝试估算其总共包含多少个标量元素(像素值)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第1章课件:机器学习的数学基础 I
    下载
  • 第1章笔记:机器学习导论
    下载
  • 第1章笔记:行列式的几何解释
    下载
  • 第1章笔记:Lp 范数
    下载