查看全课大纲(第 3 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
矩阵与张量
约 19 分钟
小象实战讲义 · 机器学习算法精讲
在上一节我们学习了向量的概念与运算,它们是描述高维空间中单个数据点的基本工具。然而,现实世界的数据往往是成批出现的,例如一个班级所有学生的成绩,或是一张图片的所有像素。为了高效地组织和处理这些批量数据,我们需要引入矩阵和张量。本节将系统讲解矩阵的定义、运算及其转置,并深入探讨张量这一更高维度的数据结构,理解它们在描述复杂数据(如图像、物理应力场)中的核心作用。
💡 核心导读
- 矩阵是向量的集合:理解矩阵是多个列向量(或行向量)的并排放置,是数据集的天然表示形式。
- 转置是视角的转换:掌握矩阵转置的操作与几何意义,它是连接行向量与列向量的桥梁。
- 数据的高维表示:学习如何用矩阵表示图像、用户特征等实际数据,明确维度(
n)与样本量(N)的数学记号。 - 张量是矩阵的推广:从向量(一阶张量)、矩阵(二阶张量)到更高阶张量,理解其作为描述多维关系(如物体受力)的强大工具。
从向量到矩阵
一个向量可以看作是一个特殊的矩阵。当我们把多个向量并排放置时,就构成了一个矩阵。
矩阵的定义与表示
顺带一提历史:矩阵这个概念最早正是在求解多项式方程组的过程中发展起来的,后来才成为高等数学与机器学习中无处不在的基础结构。
一个 的矩阵 有 行(row)和 列(column),其元素可以表示为: 其中 表示位于第 行、第 列的元素。
向量的默认形式 在数学和机器学习中,有一个重要的约定:
- 列向量是默认形式:当我们说“给定一个向量 ”时,如果没有特别说明,通常默认它是一个列向量,即 。
- 行向量是列向量的转置:行向量可以表示为列向量的转置,记作 。
这个约定影响了运算的写法。例如,向量与自身的点积(内积)表示为: 这里, 是 的行向量, 是 的列向量,两者相乘得到一个标量。
# 示例:向量点积计算
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矩阵的转置 矩阵的转置操作是将矩阵的行和列互换。对于一个 的矩阵 ,其转置 是一个 的矩阵,满足 。
例如,一个 的矩阵转置后变为 的矩阵。
# 示例:矩阵转置
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)。
例如,描述“秦同学”的向量可能是: 这里每个维度(身高、体重等)代表一个特征,向量 ,其中 是特征的个数,也称为维度(dimension)。
整个数据集:矩阵 当我们有多个数据点时,例如 个学生,我们可以将每个学生的特征向量作为一列,堆叠起来形成一个矩阵 : 其中 。这样,矩阵 的形状就是 (如果向量是列向量)。每一列是一个样本,每一行是一个特征在所有样本上的取值。
统一的数学记号 在本课程中,我们采用以下记号以保持清晰:
- 小写 :表示单个数据点的维度(dimension),即特征的个数。
- 大写 :表示数据集中样本的数量(size)。
- 因此,数据集矩阵 的维度通常是 (特征数 × 样本数)。
这种表示方法将整个数据集浓缩为一个数学对象,便于我们后续进行批量计算和模型训练。
张量:更高维度的推广
矩阵是二维的数据表格。当我们需要表示更复杂、具有更多维度的数据时,就需要引入张量(Tensor)。张量可以看作是向量和矩阵向更高维度的推广。
张量的阶(Rank)
- 零阶张量:标量(Scalar),只是一个数字,例如温度值 。
- 一阶张量:向量(Vector),例如空间中的力 。它需要一组基向量(如 )来表示。
- 二阶张量:矩阵(Matrix),例如描述一个立方体表面应力状态的应力张量。它需要两组基向量的组合(如 等)来表示。
- 更高阶张量:可以有三阶、四阶等,用于描述更复杂的多维关系。
从向量到张量的直观理解 考虑三维空间的标准正交基 。
- 一个向量 可以表示为相对于这组基的坐标 。这是一个一阶张量。
- 一个二阶张量(例如应力张量)需要描述在两个方向上的作用。它可以表示为一个 的矩阵,其每个元素 表示在 方向平面上、沿 方向的应力分量。这个矩阵的基是 等所有两两组合。
讲师还给了一个”同一批数据、换着形状看”的例子:64 个数,可以看作一个 64 维向量(一阶);也可以排成 8×8 的矩阵(二阶);还可以堆成 4×4×4 的立方块(三阶张量)。数据本身没变,变的是我们观察它的维度组织方式——图像处理中各卷积层”卷”出的特征面再组合起来,正是这样层层成张量的过程。
张量的应用
- 物理学:应力张量完美描述了物体内部任意一个微小面积元上的受力情况。这个面积元本身有方向(其法向量),施加在其上的力也有方向。二阶张量可以同时编码面积元的方向和力的方向信息,这是标量或向量无法做到的。
- 机器学习与深度学习:张量是处理多维数据的核心。
- 图像数据:一张彩色图片不仅是宽度×高度的像素网格,每个像素还有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]]
几何解释:多个矩阵的堆叠,如一个图像批次。📝 动手练一练
- 概念辨析:假设我们有一个数据集,包含1000张128×128像素的彩色图片(RGB三通道)。请问,如果我们将整个数据集存储为一个张量,这个张量的“阶”是多少?它的形状(shape)是什么?(请用
(维度1, 维度2, ...)的形式描述)
👉 点击查看参考答案
这是一个四阶张量。
- 第0维(最外层):样本数量,即图片的张数,
1000。 - 第1维:图片的高度,
128。 - 第2维:图片的宽度,
128。 - 第3维:图片的颜色通道数,
3(对应R, G, B)。 因此,该张量的形状是(1000, 128, 128, 3)。 在深度学习中,我们经常用这种形状的张量来表示一个批次的图像数据。
- 代码实践:在讲解向量点积时,我们使用了
dot_product函数。请编写一个函数matrix_vector_multiply(A, v),实现矩阵 ()与列向量 ()的乘法,返回结果向量 ()。请用纯Python列表操作实现,并使用一个小例子验证(例如 , )。
👉 点击查看参考答案
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]本章小结
本节我们深入探讨了矩阵和张量,它们是构建机器学习数学大厦的基石。
- 矩阵 系统地组织了我们的数据,将 个 维样本优雅地封装在一个 的结构中,为后续的批量计算铺平了道路。
- 转置 操作不仅是行与列的互换,更体现了向量空间中对偶的视角,是许多公式(如内积 )得以简洁表达的关键。
- 张量 作为向量和矩阵向高维的推广,为我们描述图像、视频、物理场等复杂、多维度关联的数据提供了统一的数学语言。理解标量、向量、矩阵、张量之间的阶次关系,是迈向深度学习等现代机器学习领域的必经之路。
📋 行动清单
学完本节,你可以立即:
- 审视你的数据:尝试用
(特征维度 n, 样本数量 N)的矩阵形式,在脑海中重新组织你熟悉的一个数据集(如鸢尾花数据集、房价数据)。 - 手算验证:任取一个 的小矩阵 和一个三维向量 ,手动计算 和 ,并与同伴或代码结果核对,巩固对矩阵运算的理解。
- 联想应用:观察一张手机图片,思考它作为一个三阶张量(高度×宽度×通道)的具体含义,并尝试估算其总共包含多少个标量元素(像素值)。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。