1. 向量基础概念与运算
1.1 向量的定义与表示
在数学和计算机科学中,向量是最基础的数据结构之一。简单来说,向量就是一组有序排列的数字。想象一下你去超市购物,购物清单上列出的各种商品数量就可以看作一个向量 - 第一个数字代表苹果的数量,第二个代表香蕉的数量,依此类推。
形式上,n维向量可以表示为:
code复制v = [v₁, v₂, ..., vₙ]
其中每个vᵢ称为向量的分量或元素。根据排列方式不同,向量分为:
- 行向量:水平排列,如 [1, 2, 3]
- 列向量:垂直排列,如 [1
2
3]
在实际应用中,列向量更为常见,特别是在机器学习领域。例如,在图像处理中,一张28×28像素的灰度图片可以展平为一个784维的列向量。
1.2 向量的内积与正交性
向量的内积(也叫点积)是一个非常重要的运算。对于两个n维向量a和b,它们的内积定义为:
code复制a·b = a₁b₁ + a₂b₂ + ... + aₙbₙ
内积的几何意义是什么呢?它可以表示为:
code复制a·b = ||a|| ||b|| cosθ
其中||a||表示向量a的长度(模),θ是两向量间的夹角。从这个公式可以看出:
- 当两个向量方向相同时,内积最大
- 当两个向量垂直时,内积为零
- 当两个向量方向相反时,内积最小(负值)
特别地,当a·b = 0时,我们称这两个向量正交(垂直)。这个概念在机器学习中非常重要,例如在主成分分析(PCA)中,我们会寻找一组相互正交的主成分方向。
注意:在代码实现内积时,要注意向量的维度匹配。在Python中可以使用numpy的dot函数:
python复制import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) np.dot(a, b) # 输出32
1.3 正交矩阵及其性质
正交矩阵是一种特殊的方阵,它的列向量(或行向量)两两正交且长度为1。数学上,矩阵Q是正交矩阵的条件是:
code复制QᵀQ = I
其中Qᵀ表示Q的转置,I是单位矩阵。
正交矩阵有几个重要性质:
- 保持向量长度不变:||Qx|| = ||x||
- 保持向量夹角不变:(Qx)·(Qy) = x·y
- 逆矩阵容易计算:Q⁻¹ = Qᵀ
在计算机图形学中,旋转矩阵就是正交矩阵的典型例子。例如,2D旋转θ角的矩阵:
code复制[ cosθ -sinθ ]
[ sinθ cosθ ]
这个矩阵乘以任何向量,都会将该向量旋转θ角度而不改变其长度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 向量组的线性相关性
2.1 线性相关与线性无关
理解线性相关性是掌握线性代数的关键。想象你在一家餐厅点菜:如果菜单上的菜品可以互相替代(比如用两个小份代替一个大份),那么这些菜品就是"线性相关"的;如果每道菜都独一无二不可替代,那就是"线性无关"。
正式定义:对于向量组{a₁, a₂, ..., aₙ},如果存在不全为零的标量k₁, k₂, ..., kₙ,使得:
code复制k₁a₁ + k₂a₂ + ... + kₙaₙ = 0
则称该向量组线性相关;否则称为线性无关。
判断线性相关性的实用方法:
- 对于n个n维向量,计算它们组成的行列式:
- 行列式≠0 → 线性无关
- 行列式=0 → 线性相关
- 将向量组成矩阵,进行行简化:
- 有全零行 → 线性相关
- 无全零行 → 线性无关
- 向量个数>向量维数 → 必定线性相关
2.2 极大线性无关组与秩
极大线性无关组就像是向量组的"核心成员" - 它们是原向量组中满足以下两个条件的子集:
- 这个子集本身线性无关
- 原向量组中任何其他向量都可以由这个子集线性表示
矩阵的秩就是其列向量组的极大线性无关组中向量的个数。秩揭示了矩阵所包含的真正"信息量"。
在实际应用中,矩阵分解技术非常重要。例如,我们可以将一个矩阵A分解为:
code复制A = BC
其中B由A的极大线性无关列向量组成,C包含相应的线性组合系数。这种分解在数据压缩、推荐系统等领域有广泛应用。
2.3 等价向量组
两个向量组如果能互相线性表示,就称为等价向量组。等价向量组有以下性质:
- 秩相同(但秩相同的向量组不一定等价)
- 可以互相转换
- 生成相同的向量空间
例如,在3D空间中,标准基向量组{[1,0,0],[0,1,0],[0,0,1]}和{[1,1,0],[0,1,1],[1,0,1]}是等价的,因为它们可以互相表示且都张成整个3D空间。
3. 矩阵秩的重要性质
3.1 秩的基本不等式
矩阵秩的不等式在理论证明和实际计算中都非常有用。以下是几个最重要的秩不等式:
-
乘积矩阵的秩:
code复制r(AB) ≤ min(r(A), r(B))这意味着矩阵乘法会损失信息,不会增加秩。
-
和矩阵的秩:
code复制r(A+B) ≤ r(A) + r(B)矩阵相加的秩不会超过各自秩的和。
-
零空间关系:
如果AB=0,则:code复制r(A) + r(B) ≤ n其中n是A的列数/B的行数。
这些不等式在机器学习中很有用,例如在分析神经网络层的表达能力时,可以帮助我们理解信息是如何在层间传递和变化的。
3.2 伴随矩阵的秩
伴随矩阵A*的秩与原矩阵A的秩有明确关系:
| A的秩 | A*的秩 |
|---|---|
| n | n |
| n-1 | 1 |
| <n-1 | 0 |
这个性质在求解线性方程组和计算逆矩阵时非常有用。例如,当A是满秩方阵时,我们可以用伴随矩阵法求逆:
code复制A⁻¹ = A* / det(A)
4. 向量空间与基变换
4.1 向量空间的基本概念
向量空间是线性代数中最重要的抽象概念之一。简单来说,向量空间就是一个对加法和数乘运算封闭的向量集合。常见的例子包括:
- ℝⁿ:所有n维实向量
- 多项式空间:所有次数≤n的多项式
- 函数空间:某些特定类型的函数
在向量空间中,基是一组线性无关的向量,它们可以表示空间中任何其他向量。基中向量的个数称为空间的维数。
4.2 基变换与坐标变换
在实际应用中,我们经常需要在不同的基之间转换。设有一组旧基{ξ₁, ξ₂, ..., ξₙ}和一组新基{n₁, n₂, ..., nₙ},它们之间的关系可以表示为:
code复制[n₁, n₂, ..., nₙ] = [ξ₁, ξ₂, ..., ξₙ]C
其中C称为过渡矩阵。
坐标变换公式告诉我们,同一个向量在不同基下的坐标x和x'满足:
code复制x = Cx'
这在计算机图形学中非常有用,例如将物体从局部坐标系转换到世界坐标系。
4.3 施密特正交化过程
施密特正交化是将一组线性无关向量转化为正交向量组的方法。具体步骤如下:
给定向量组{α₁, α₂, ..., αₙ},计算正交向量组{β₁, β₂, ..., βₙ}:
- β₁ = α₁
- β₂ = α₂ - (α₂·β₁)/(β₁·β₁) * β₁
- β₃ = α₃ - (α₃·β₁)/(β₁·β₁) * β₁ - (α₃·β₂)/(β₂·β₂) * β₂
- 以此类推...
最后,将每个βᵢ单位化得到标准正交基。这个过程在QR分解和主成分分析等算法中都有应用。
5. 线性代数在机器学习中的应用
5.1 特征值与特征分解
特征值和特征向量在许多机器学习算法中扮演重要角色。对于方阵A,如果存在非零向量v和标量λ使得:
code复制Av = λv
则称λ为特征值,v为对应的特征向量。
特征分解将矩阵表示为:
code复制A = QΛQ⁻¹
其中Q是特征向量组成的矩阵,Λ是对角特征值矩阵。这在主成分分析(PCA)中用于降维。
5.2 奇异值分解(SVD)
SVD是更通用的矩阵分解方法,适用于任意m×n矩阵:
code复制A = UΣVᵀ
其中U和V是正交矩阵,Σ是对角矩阵。SVD在推荐系统、图像压缩等领域应用广泛。
5.3 矩阵求导与优化
在训练机器学习模型时,经常需要对矩阵函数求导。例如,线性回归的损失函数:
code复制L(w) = ||Xw - y||²
其对参数w的导数为:
code复制∇L(w) = 2Xᵀ(Xw - y)
理解这些矩阵运算对于实现和优化机器学习算法至关重要。
6. 常见问题与实用技巧
6.1 如何判断矩阵是否可逆?
判断矩阵可逆的几种方法:
- 行列式≠0
- 满秩(秩=矩阵阶数)
- 行/列向量线性无关
- 没有零特征值
在实际编程中,由于浮点数精度问题,最好检查行列式的绝对值是否大于某个小阈值(如1e-10)。
6.2 矩阵秩的计算技巧
计算矩阵秩的实用方法:
- 行简化阶梯形:非零行数就是秩
- SVD分解:非零奇异值的个数
- QR分解:非零对角元素个数
在Python中,可以使用numpy的matrix_rank函数:
python复制import numpy as np
A = np.array([[1, 2], [3, 4]])
np.linalg.matrix_rank(A) # 输出2
6.3 处理病态矩阵
当矩阵条件数很大时,称为病态矩阵,求逆或解方程会不稳定。解决方法包括:
- 使用伪逆(Moore-Penrose逆)
- 添加正则化项(如岭回归)
- 使用SVD分解并截断小奇异值
6.4 高效矩阵运算建议
- 尽量使用矩阵运算而不是循环
- 利用矩阵的稀疏性
- 选择合适的分解方法(LU、QR、Cholesky等)
- 注意内存访问模式以提高缓存命中率
例如,在Python中,使用numpy的dot函数比手动循环快得多:
python复制# 好的做法
result = np.dot(A, B)
# 不好的做法
result = np.zeros((n, m))
for i in range(n):
for j in range(m):
for k in range(p):
result[i,j] += A[i,k] * B[k,j]
理解线性代数的概念和运算对于掌握机器学习至关重要。从向量和矩阵的基本操作,到更高级的分解和空间变换,这些工具构成了机器学习算法的数学基础。建议通过实际编程练习来巩固这些概念,例如实现自己的PCA算法或线性回归模型。
