9·数学基础入门

线性代数概述:向量与矩阵的意义

mathlinear-algebra

第 9 课 - 线性代数概述:向量与矩阵的意义

学习目标

完成本课学习后,你将能够:

  1. 理解向量和矩阵在机器学习中的核心角色:明白它们是数据存储和模型计算的基本语言。
  2. 使用 Python(NumPy)创建和操作向量与矩阵:能够用代码表示数据。
  3. 识别并区分行向量、列向量、矩阵的维度:这是进行正确数学运算的基础。
  4. 建立“数据即向量/矩阵”的直觉:为后续学习向量运算、矩阵变换等概念做好思想准备。

核心概念

在上一课,我们用 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:

  1. Phone_A 的数据创建为一个名为 phone_a 的向量,并打印其形状。
  2. 将三部手机的数据创建为一个名为 phones 的矩阵(3行3列),并打印整个矩阵和其形状。

练习 2:矩阵切片 基于上一题创建的 phones 矩阵,写出代码并打印:

  1. 第二部手机(索引为1)的所有数据。
  2. 所有手机的价格(第一列)。
  3. 手机价格和重量的组合(前两列)。

练习 3:思考与探索 假设 data_matrix 代表3个学生的语文、数学、英语成绩。

data_matrix = np.array([
    [90, 85, 88],  # 学生A
    [78, 92, 75],  # 学生B
    [85, 88, 90]   # 学生C
])
  1. 如何用一行代码取出“数学”成绩(第二列)最高的那个学生的所有成绩? 提示:先找到数学成绩(第二列)最大值的索引,然后用这个索引取出行。 预期输出应为:[78, 92, 75] (学生B的数学最高)

常见错误

  1. 混淆向量和矩阵的维度

    • 错误:将一个长度为 n 的一维数组直接当作 n x 1 的矩阵(列向量)去进行矩阵乘法。
    • 后果:在 np.dot(A, v) 时,如果 Am x n 矩阵,v(n,) 一维数组,NumPy 会按规则计算,但当 v 应该是 (n,1) 而你传入 (n,) 时,后续逻辑可能出错。
    • 建议:在需要明确区分行/列向量时(尤其在线性代数运算中),使用 .reshape()
  2. 索引错误

    • 错误:使用 matrix[row_index][col_index] 而非 matrix[row_index, col_index]
    • 后果:在大多数情况下结果相同,但 matrix[i, j] 是更高效且地道的 NumPy 写法,尤其在切片时更清晰。
  3. 忽略数据布局(行 vs 列)

    • 错误:在构建矩阵时,把每个样本的特征放在了上,而不是上。
    • 后果:大多数机器学习库(Scikit-learn)默认约定 X 矩阵是 (n_samples, n_features),即 行是样本,列是特征。如果你的数据是反的,模型将无法正确理解你的数据。

小结

在本课中,我们揭开了机器学习数据表示的神秘面纱:

  • 向量一维数组,是数据在特征空间中的一个点。它代表了单个数据样本的所有属性。
  • 矩阵二维数组,是多个向量的集合,构成了一张数据表。它的行代表样本,列代表特征。
  • NumPy 是我们操作这些数字“砖块”的强大工具,通过 np.array() 创建,通过 .shape 查看维度,通过索引和切片进行访问。
  • 理解向量和矩阵,就是理解了机器学习算法语言的“字母”和“单词”。所有复杂的模型和运算,都是建立在这些基础之上的。

在下一课,我们将学习如何对这些“砖块”进行基本的数学操作——向量运算,这是构建更复杂模型的第一步。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「向量运算:加法、点积与范数」 以巩固所学知识。