趋近智
在上一节中,我们看到了向量如何通过标量乘法和加法组合形成线性组合,张成特定空间或子空间。一个自然而然的问题随之出现:给定一组张成某个空间的向量,它们是否都真正必需?或者我们是否可以用更少的向量实现相同的张成,因为有些是“多余的”?这引出了线性独立性的思想。
设有一组向量 {v1,v2,...,vk}。我们想知道这组向量中的任何一个是否可以表示为其他向量的线性组合。如果其中一个向量可以由其他向量组合而成,那么它就不会为这组向量张成的方向或维度增加任何新的内容;在张成的背景下,它本质上是多余的信息。如果这组向量中没有任何一个向量可以表示为其他向量的线性组合,那么这组向量被称为线性独立。
正式而言,向量空间中的一组向量 {v1,v2,...,vk} 被称为线性独立,如果向量方程:
c1v1+c2v2+...+ckvk=0
的唯一解是所有标量系数都为零的平凡解:c1=0,c2=0,...,ck=0。
反之,如果存在至少一个非平凡解(即至少一个系数 ci 非零),则这组向量是线性相关的。如果向量线性相关,这意味着至少有一个向量 vi 可以被分离出来,并表示为集合中其他向量的线性组合。例如,如果 ci=0,我们可以将方程重新排列为:
vi=−cic1v1−...−cici−1vi−1−cici+1vi+1−...−cickvk
这表明 vi 位于其他向量的张成空间内。
我们来在熟悉的空间中将其形象化:
考虑 R2 中的两组向量:集合 A = { (2, 1), (4, 2) } 和集合 B = { (2, 1), (1, 3) }。
集合 A 的向量(黑色和红色)是线性相关的,因为 v2 只是 v1 的 2 倍。它们位于同一直线上。集合 B 的向量(黑色和蓝色)是线性独立的,因为 v3 无法表示为 v1 的标量倍数。它们指向不同的方向。
线性独立性不只是一种抽象的代数性质。它在机器学习中有着直接的关联,尤其是在处理特征时:
特征冗余: 如果数据集中特征向量线性相关,这表明某些特征相对于其他特征没有提供独特的信息。例如,如果一个特征仅仅是另外两个特征的总和(例如,total_sales = domestic_sales + international_sales),那么包含这三个特征可能是多余的。这可能不必要地增加模型复杂度,有时还会掩盖潜在独立因素的重要性。
模型中的多重共线性: 在线性回归等模型中,我们经常求解涉及特征矩阵 X 的方程组。如果 X 的列(表示不同特征)线性相关,矩阵 XTX 将变得奇异(不可逆)或接近奇异。这种情况被称为完美或高度多重共线性,它使得为模型系数找到唯一解变得不可能。估计值对数据的微小变化变得高度敏感,标准误差膨胀,并且解释单个特征的贡献变得不可靠。
维度与基: 线性独立向量集对于定义向量空间或子空间的“基”是必不可少的,这些基代表了该空间的基本方向或组成部分。理解线性独立性有助于维度降低技术,这些技术的目标通常是找到一组较小的线性独立向量(或分量),它们能捕获原始数据中的大部分信息。
我们如何判断一组向量 {v1,v2,...,vk} 是否线性独立?我们需要检查方程 c1v1+c2v2+...+ckvk=0 的唯一解是否是 c1=c2=...=ck=0。
这个向量方程可以改写成矩阵方程。令 A 是以向量 v1,v2,...,vk 为列的矩阵。令 c 是未知系数的列向量 [c1,c2,...,ck]T。该方程变为:
Ac=0
这是一个齐次线性方程组。
根据我们对线性方程组的了解(第三章),我们知道 Ac=0 只有平凡解当且仅当矩阵 A 具有满列秩。也就是说,矩阵 A 的秩必须等于列数(即向量的数量,k)。
使用秩进行实用检查: 在计算上检查线性独立性的最常见方法是,将向量作为列形成矩阵 A,然后计算其秩。
rank(A) == k(向量数量),则向量线性独立。rank(A) < k,则向量线性相关。我们可以使用 NumPy 等库来计算秩:
import numpy as np
# 示例 1:线性相关向量(来自图示)
v1 = np.array([2, 1])
v2 = np.array([4, 2])
A = np.array([v1, v2]).T # 向量作为列
# A 是 [[2, 4],
# [1, 2]]
rank_A = np.linalg.matrix_rank(A)
num_vectors_A = A.shape[1]
print(f"集合 A:矩阵秩 = {rank_A},向量数量 = {num_vectors_A}")
# 输出:集合 A:矩阵秩 = 1,向量数量 = 2
# 因为秩 < 向量数量,所以它们线性相关。
# 示例 2:线性独立向量(来自图示)
v1 = np.array([2, 1])
v3 = np.array([1, 3])
B = np.array([v1, v3]).T # 向量作为列
# B 是 [[2, 1],
# [1, 3]]
rank_B = np.linalg.matrix_rank(B)
num_vectors_B = B.shape[1]
print(f"集合 B:矩阵秩 = {rank_B},向量数量 = {num_vectors_B}")
# 输出:集合 B:矩阵秩 = 2,向量数量 = 2
# 因为秩 == 向量数量,所以它们线性独立。
# 示例 3:R^2 中的三个向量(必然相关)
v1 = np.array([2, 1])
v3 = np.array([1, 3])
v4 = np.array([-1, 1])
C = np.array([v1, v3, v4]).T
# C 是 [[ 2, 1, -1],
# [ 1, 3, 1]]
rank_C = np.linalg.matrix_rank(C)
num_vectors_C = C.shape[1]
print(f"集合 C:矩阵秩 = {rank_C},向量数量 = {num_vectors_C}")
# 输出:集合 C:矩阵秩 = 2,向量数量 = 3
# 因为秩 < 向量数量,所以它们线性相关。
# (正如预期,R^2 中不能有 3 个线性独立向量)
理解线性独立性是根本的。它帮助我们识别数据中的冗余,确保某些机器学习算法的稳定性,并为基和维度等内容奠定了基础,这些我们将接下来查看。这些思想使我们能够精确定义数据所在向量空间的“大小”和结构。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造