第 9 课 - 线性代数概述:向量与矩阵的意义
学习目标
完成本课学习后,你将能够:
- 理解向量和矩阵在机器学习中的核心角色:明白它们是数据存储和模型计算的基本语言。
- 使用 Python(NumPy)创建和操作向量与矩阵:能够用代码表示数据。
- 识别并区分行向量、列向量、矩阵的维度:这是进行正确数学运算的基础。
- 建立“数据即向量/矩阵”的直觉:为后续学习向量运算、矩阵变换等概念做好思想准备。
核心概念
在上一课,我们用 Scikit-learn 训练了第一个模型。我们传入了 X(特征数据)和 y(标签)。你是否好奇,这些数据在计算机内部到底是如何存储和计算的?答案就是:向量(Vector) 和 矩阵(Matrix)。
1. 向量:一个数据的坐标
想象一下你描述一个人的特征:身高、体重、年龄。用数字表示就是 [175, 65, 30]。在机器学习中,这组数字就是一个 向量。更正式地说:
- 向量 是一个一维数组,它代表空间中的一个点或一个方向。
- 在代码中,我们通常使用 列向量 来表示单个数据样本的所有特征(就像我们例子中的
[175, 65, 30])。 - 每一个维度的值(如175)被称为这个向量的一个元素或分量。
2. 矩阵:一个数据的表格 如果我们收集了多个人的数据,比如:
Person1: [175, 65, 30]
Person2: [180, 80, 25]
Person3: [165, 55, 35]
把它们堆叠起来,就形成了一个矩阵。
- 矩阵 是一个二维数组,可以看作是多个向量的集合,也可以看作是一张表格。
- 它的行(Row) 通常代表不同的数据样本(如不同的人)。
- 它的列(Column) 通常代表不同的特征(如身高、体重、年龄)。
为什么机器学习离不开它们? 机器学习的核心是计算。向量和矩阵提供了一种高效、标准化的方式来表示数据和进行计算。
- 数据表示:所有输入数据(如图片像素、文本词向量、表格数据)最终都被转换为数字向量或矩阵。
- 模型参数:线性回归的权重、神经网络的连接强度,本质上都是向量或矩阵。
- 计算加速:现代CPU和GPU对向量和矩阵的批量计算(称为向量化操作)进行了极致优化,速度远快于循环处理单个数字。
理解它们,就是理解了机器学习这座大厦的“砖块”和“水泥”。
代码示例
我们将使用 NumPy 库,它是 Python 科学计算的基石,也是所有机器学习库(如 Scikit-learn, PyTorch)的底层依赖。
import numpy as np
# 1. 创建向量
# 用一个列表表示一个向量(通常视为列向量)
vector_person1 = np.array([175, 65, 30])
print(f"一个向量(代表一个人的数据):\n{vector_person1}")
print(f"这个向量的形状(维度)是: {vector_person1.shape} -> (3,) 表示一个长度为3的一维数组")
# 2. 创建矩阵
# 用一个列表的列表(嵌套列表)来创建矩阵
data_matrix = np.array([
[175, 65, 30], # 第1行,第1个样本
[180, 80, 25], # 第2行,第2个样本
[165, 55, 35] # 第3行,第3个样本
])
print(f"\n一个矩阵(代表三个人的数据):\n{data_matrix}")
print(f"这个矩阵的形状(维度)是: {data_matrix.shape} -> (3, 3) 表示3行3列")
# 3. 访问矩阵的元素
print(f"\n矩阵第0行(第1个人)的所有数据: {data_matrix[0]}")
print(f"矩阵第1列(所有人的体重)的数据: {data_matrix[:, 1]}")
# 4. 理解行向量和列向量
# 在 NumPy 中,一维数组 `np.array([1,2,3])` 在运算时既不是严格的行向量也不是列向量。
# 我们可以通过 `reshape` 来明确指定。
row_vector = np.array([1, 2, 3]).reshape(1, 3) # 明确创建一个 1x3 的行向量
col_vector = np.array([1, 2, 3]).reshape(3, 1) # 明确创建一个 3x1 的列向量
print(f"\n明确的行向量 (1x3): {row_vector.shape}")
print(f"明确的列向量 (3x1): {col_vector.shape}")
print("在后续课程中,当我们进行矩阵乘法时,向量的‘方向’(行或列)至关重要。")
实践练习
练习 1:基础创建与查看 给定以下关于3部手机的数据:价格(元)、重量(克)、屏幕尺寸(英寸)。
Phone_A: [4999, 192, 6.7]
Phone_B: [3999, 187, 6.6]
Phone_C: [2999, 195, 6.8]
使用 NumPy:
- 将
Phone_A的数据创建为一个名为phone_a的向量,并打印其形状。 - 将三部手机的数据创建为一个名为
phones的矩阵(3行3列),并打印整个矩阵和其形状。
练习 2:矩阵切片
基于上一题创建的 phones 矩阵,写出代码并打印:
- 第二部手机(索引为1)的所有数据。
- 所有手机的价格(第一列)。
- 手机价格和重量的组合(前两列)。
练习 3:思考与探索
假设 data_matrix 代表3个学生的语文、数学、英语成绩。
data_matrix = np.array([
[90, 85, 88], # 学生A
[78, 92, 75], # 学生B
[85, 88, 90] # 学生C
])
- 如何用一行代码取出“数学”成绩(第二列)最高的那个学生的所有成绩?
提示:先找到数学成绩(第二列)最大值的索引,然后用这个索引取出行。
预期输出应为:
[78, 92, 75](学生B的数学最高)
常见错误
-
混淆向量和矩阵的维度
- 错误:将一个长度为
n的一维数组直接当作n x 1的矩阵(列向量)去进行矩阵乘法。 - 后果:在
np.dot(A, v)时,如果A是m x n矩阵,v是(n,)一维数组,NumPy 会按规则计算,但当v应该是(n,1)而你传入(n,)时,后续逻辑可能出错。 - 建议:在需要明确区分行/列向量时(尤其在线性代数运算中),使用
.reshape()。
- 错误:将一个长度为
-
索引错误
- 错误:使用
matrix[row_index][col_index]而非matrix[row_index, col_index]。 - 后果:在大多数情况下结果相同,但
matrix[i, j]是更高效且地道的 NumPy 写法,尤其在切片时更清晰。
- 错误:使用
-
忽略数据布局(行 vs 列)
- 错误:在构建矩阵时,把每个样本的特征放在了列上,而不是行上。
- 后果:大多数机器学习库(Scikit-learn)默认约定
X矩阵是(n_samples, n_features),即 行是样本,列是特征。如果你的数据是反的,模型将无法正确理解你的数据。
小结
在本课中,我们揭开了机器学习数据表示的神秘面纱:
- 向量 是一维数组,是数据在特征空间中的一个点。它代表了单个数据样本的所有属性。
- 矩阵 是二维数组,是多个向量的集合,构成了一张数据表。它的行代表样本,列代表特征。
- NumPy 是我们操作这些数字“砖块”的强大工具,通过
np.array()创建,通过.shape查看维度,通过索引和切片进行访问。 - 理解向量和矩阵,就是理解了机器学习算法语言的“字母”和“单词”。所有复杂的模型和运算,都是建立在这些基础之上的。
在下一课,我们将学习如何对这些“砖块”进行基本的数学操作——向量运算,这是构建更复杂模型的第一步。
练习编辑器
rust
Loading...