跳到主要内容 SVD 奇异值分解原理、推导及应用实例 | 极客日志
Python AI 算法
SVD 奇异值分解原理、推导及应用实例 系统讲解了奇异值分解(SVD)的数学原理与几何意义,通过线性代数知识铺垫,详细推导了 SVD 公式及其求解方法。文章涵盖了 SVD 在数据降维、推荐系统、自然语言处理、图像处理及信号处理等领域的实际应用,并提供了基于 Python NumPy 库的代码实现示例,包括图像压缩、数据降维可视化及最小二乘拟合等场景。
小熊软糖 发布于 2026/3/26 更新于 2026/4/16 12K 浏览SVD 奇异值分解完整教程
1. 预备线性代数知识
假定有一个线性代数方程,其中矩阵 A(mxn)
$$A\vec{x}=\vec{b} \tag{1}$$
通过上面的式子我们可以知道以下几点定论:
1. 矩阵 A 是线性方程组(1)的系数矩阵,列变量 x 是线性方程组(1)的解;系数矩阵 A 的秩 rank(A) 决定了线性方程组的极大线性无关组的情况,对于高斯消元法求解也较为方便。
根据秩和增广矩阵的秩(即包含常数项列的矩阵 [A|b] 的秩)之间的比较,我们可以得出以下三种经典结论:
无解:当 rank(A) < rank([A|b]) 时,方程组矛盾,无解。
唯一解:当 rank(A) = rank([A|b]) = n(n 为未知数个数)时,方程组有唯一解。
无穷多解:当 rank(A) = rank([A|b]) < n 时,方程组有无穷多解。
高斯消元法求线性方程组其实就是平时用的化为行最简型的过程
2. 当 m ≥ n 并且 rank(A) = n 时,矩阵 A 是 R^n 这个空间中的一个基,也就是说系数矩阵 A 的各个列是线性无关的,而线性无关就可以作为空间下的一个"正交基",只不过不是标准正交基,是有倍数的正交基
这里该怎么解释一下呢,就好像一个向量,在二维空间里,x=(1,0) 和 y=(0,1) 是一对标准正交基,任何一个二维空间内的坐标都可以被这一对标准正交基表示出来,比如:z=(3,4)=3x+4y。
而对于另一对正交基 a=(3,0) 和 b=(0,4) 来说,依然是任何一个二维空间内的坐标都可以被这对正交基表示出来,比如:z=a+b。这二者最大的区别就是后者的两个线性无关的向量的模非 1,而标准正交基的模是 1
线性方程组式(1)蕴含着一个基础的线性变换关系
$$A\vec{x}=I\vec{b} \tag{1-1}$$
公式(2)的含义是,系数矩阵 A 可以对向量 $\vec{x}=[x_1, \cdots, x_n]^T$ 进行线性变换,使其变为 $\vec{b}=[b_1, \cdots, b_n]$。
其中 I 是一个标准正交基,公式(2)表示了向量在新基下的坐标到标准正交基下的坐标的转换过程。
2. SVD 的数学含义
2.1 核心定理 对于任意的矩阵 A,我们总能找到一组单位正交基,使得 A 对其进行变换之后,得到的向量组仍然是正交的
事实上,一个矩阵并不是在所有的基下都具备通用的性质,比如在二维空间中的一个系数矩阵
$$A=\begin{pmatrix} 1 & 2 \ 4 & 4 \end{pmatrix} \tag{I}$$
使得进行运算操作 $A\vec{x}$ 和 $A\vec{y}$。其中 x 和 y 是二维空间下在 x 轴和 y 轴上的单位变量
则
$$A\vec{x}=\begin{pmatrix} 1 \ 3 \end{pmatrix} \text{ 并且 } A\vec{y}=\begin{pmatrix} 2 \ 4 \end{pmatrix} \tag{II}$$
最后得到的结果不是正交的,但是这个性质的重点在于,在多维空间 R^n 中,你一定能找到一对正交基,使得 A 对其进行线性变换后得到的向量还是正交的。
2.2 直观理解 通常情况下,如果我们随便拿一个矩阵 A(比如一个歪歪扭扭的矩形变换矩阵),去乘以一组普通的正交基(比如标准坐标系的 x 轴和 y 轴单位向量),得到的新向量通常不再正交 了(变成了平行四边形的两边)。
但是,SVD 告诉我们:别慌,虽然标准基不行,但总存在那么两组"特殊"的正交基 。
输入端(原空间): 总存在一组特殊的正交基 $v_1, v_2$。
输出端(目标空间): 当矩阵 A 作用在这组特殊的基上时,得到的新向量 $u_1, u_2$恰好也是正交的 。
为什么这很神奇?
因为这意味着矩阵 A 在这组"特殊基"上,只做了"拉伸"这件事,而没有做"错切"或"挤压变形" 。因为如果做了错切,输出的向量就不正交了。
2.3 几何类比
普通情况: 你用力拉扯一个圆,把它变成了一个歪斜的椭圆。这时候,原来圆上互相垂直的两条直径,现在可能变成了椭圆上两条不垂直的弦。
SVD 的情况: SVD 说,不管你刚才怎么乱拉,总能找到圆上两条特定的、互相垂直的直径 。当你把圆拉成椭圆后,这两条特定的直径虽然长度变了,但它们依然保持互相垂直 ,并且正好变成了椭圆的长轴 和短轴 。
变换后还是正交的,是因为我们找到了这组"天生一对"的输入方向($v$)。矩阵 A 对它们的作用非常干净,仅仅是把它们旋转 到了输出空间,并在原方向上进行了拉伸 ,而没有引入剪切力。
3. SVD 公式推导
3.1 SVD 的核心内容 设有矩阵 A,其对单位正交基 $v_1, v_2$ 进行线性变换,得到的向量仍然是彼此正交的,即 $Av_1, Av_2$ 仍然是正交的。设 $Av_1, Av_2$ 方向上的单位向量是 $\mu_1, \mu_2$,长度是 $\sigma_1, \sigma_2$,则我们可得
$$A\vec{v}_1 = \sigma_1\vec{\mu}_1 \tag{2}$$
$$A\vec{v}_2 = \sigma_2\vec{\mu}_2 \tag{3}$$
现在利用矩阵 A 对向量 x 进行线性变换。我们先将向量 x 在单位正交基 $v_1, v_2$ 上进行表示,即
$$\vec{x} = [v_1, v_2] \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x}$$
$$= [v_1, v_2] \cdot \begin{bmatrix} v_1^\top \vec{x} \ v_2^\top \vec{x} \end{bmatrix} \tag{4}$$
$$\begin{aligned}
\because A\vec{x} &= A \cdot [v_1, v_2] \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x} \
&= [Av_1, Av_2] \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x} \
&= [\sigma_1 \mu_1, \sigma_2 \mu_2] \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x} \
&= [\mu_1, \mu_2] \cdot \begin{bmatrix} \sigma_1 & 0 \ 0 & \sigma_2 \end{bmatrix} \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x} \
&= U\Sigma V^\top \cdot \vec{x}
\end{aligned}$$
$$\therefore A = U\Sigma V^\top \tag{6}$$
至此,我们由"对于任意的矩阵 A,我们总能找到一组单位正交基,使得 A 对其进行变换之后,得到的向量组仍然是正交的",即 (2)(3) 出发,得到了矩阵 A 最终的分解形式 (6)。(6) 表达了这样一个事实,对于任意的矩阵 A,我们总可以将其分解为一个酉矩阵 U,一个对角矩阵 Σ 和另一个酉矩阵的转置 V^T 的乘积,这便是 SVD 的核心内容。
3.2 SVD 的几何含义 现在我们知道,对于任意的矩阵 A,我们总可以将其分解为一个酉矩阵 U,一个对角矩阵 Σ 和另一个酉矩阵的转置 V^T 的乘积,即等式 (6) 所表述的内容。 $A = U\Sigma V^\top$ 表示矩阵 A 所代表的线性变换可以由更简单的旋转、拉伸变换进行合成。这些更简单的变换是怎么进行生效的呢?我们还是在二维平面中举例说明。
当使用矩阵 A 对向量 x 进行变化时,我们可以先将向量 x 在单位正交基 $v_1, v_2$ 上进行表示,即 (4) 所表述。我们不妨令 $\xi_1 = v_1^\top x, \xi_2 = v_2^\top x$,则 $\xi_1, \xi_2$ 是向量 x 在单位正交基 $v_1, v_2$ 上的坐标,即
$$\begin{aligned}
\vec{x} &= [v_1, v_2] \cdot \begin{bmatrix} v_1^\top \ v_2^\top \end{bmatrix} \cdot \vec{x} \
&= [v_1, v_2] \cdot \begin{bmatrix} v_1^\top \vec{x} \ v_2^\top \vec{x} \end{bmatrix} \
&= [v_1, v_2] \cdot \begin{bmatrix} \xi_1 \ \xi_2 \end{bmatrix}
\end{aligned} \tag{7}$$
$$\begin{align}
A\vec{x} &= U\Sigma V^{\top}\cdot\vec{x} \
&= [\mu_{1},\mu_{2}]\cdot\begin{bmatrix}\sigma_{1}&0 \ 0&\sigma_{2}\end{bmatrix}\cdot\begin{bmatrix}v_{1}^{\top} \ v_{2}^{\top}\end{bmatrix}\cdot\vec{x} \
&= [\mu_{1},\mu_{2}]\cdot\begin{bmatrix}\sigma_{1}&0 \ 0&\sigma_{2}\end{bmatrix}\cdot\begin{bmatrix}v_{1}^{\top} \ v_{2}^{\top}\end{bmatrix}\cdot [v_{1},v_{2}]\cdot\begin{bmatrix}\xi_{1} \ \xi_{2}\end{bmatrix}
\end{align} \tag{8}$$
现在我们仔细地来分析 (8) 中各矩阵的具体操作效果:
$$A\vec{x} = \underbrace{[\mu_{1},\mu_{2}]}{\text{旋转}}\cdot\underbrace{\begin{bmatrix}\sigma {1}&0 \ 0&\sigma_{2}\end{bmatrix}}{\text{拉伸}}\cdot\underbrace{\begin{bmatrix}v {1}^\top \ v_{2}^\top\end{bmatrix}}{\text{旋转}}\cdot\underbrace{[v {1},v_{2}]}{\text{单位正交基}V}\cdot\underbrace{\begin{bmatrix}\xi {1} \ \xi_{2}\end{bmatrix}}_{x\text{在}V\text{坐标}} \tag{9}$$
如 (9) 所示,矩阵 A 对向量 x 进行线性变换,其先将向量 x 用单位正交基 V 进行表示。然后使用酉矩阵 V^T 进行旋转,由酉矩阵的性质我们可知 $VV^T=V^TV=I$,所以旋转之后我们可得到标准正交基 I。然后使用矩阵 Σ 对标准正交基 I 进行拉伸,使得 x-axis, y-axis 分别拉伸 $\sigma_1, \sigma_2$ 倍的长度。最后再使用酉矩阵 U 对拉伸之后的正交基进行旋转,得到最终的基,从而得到最终的向量为
$$\begin{align}
A\vec{x} &= [\sigma_{1}\mu_{1},\sigma_{2}\mu_{2}]\cdot\begin{bmatrix}\xi_{1} \ \xi_{2}\end{bmatrix} \
&= \xi_{1}\sigma_{1}\mu_{1}+\xi_{2}\sigma_{2}\mu_{2}
\end{align} \tag{10}$$
通过 SVD,我们找到了能代表矩阵 A 作为线性变换时的最本质的操作,而 $\sigma_1, \sigma_2$ 就是所谓的奇异值,表示对标准正交基各个轴进行拉伸的程度。
3.3 SVD 公式的求解 上述关于 SVD 在二维平面上的结论可以轻易地推广到多维情况。那 SVD 具体如何求解呢?由 (6) 我们知道 SVD 能使矩阵 A 进行分解,现在由 (6) 出发我们来构造矩阵 U , Σ , V ,具体地,我们有
$$AA^{\top} = U\Sigma V^{\top}V\Sigma^{\top}U^{\top} = U\Sigma^2 U^{\top} \tag{11}$$
$$A^{\top}A = V\Sigma^{\top}U^{\top}U\Sigma V^{\top} = V\Sigma^2 V^{\top} \tag{12}$$
$$A = Q\Lambda Q^{\top} \tag{13}$$
其中矩阵 Q 为酉矩阵,即满足 $Q^{\top} = Q^{-1}$。矩阵 $\Lambda = \text{diag}(\lambda_1, \cdots, \lambda_n)$ 为矩阵 A 的特征值所组成的对角矩阵。而矩阵 $AA^{\top}$,$A^{\top}A$ 是实对称矩阵,矩阵 U , V 是酉矩阵,矩阵 $\Sigma^2$ 是对角矩阵,所以由 (11), (12), (13),我们对矩阵 $AA^{\top}$,$A^{\top}A$ 进行正交对角化,即可得到矩阵 U , V 。再由
$$\begin{aligned}
&\because A = U\Sigma V^T \
&\quad;; AV = U\Sigma \
&\quad;; Av_i = \sigma_i \mu_i \
\
&\therefore \sigma_i = \frac{Av_i}{\mu_i}
\end{aligned} \tag{14}$$
关键点总结 :通过计算 $AA^\top$ 得到 U (左奇异矩阵)通过计算 $A^TA$ 得到 V (右奇异矩阵)两者的特征值平方根就是奇异值 Σ
4. SVD 的应用
4.1 数据降维(PCA 主成分分析) 原理 : 奇异值从大到小排列,前几个奇异值往往包含了大部分信息
$$A_k = U_{:,1:k} \Sigma_{1:k,1:k} V^T_{1:k,:}$$
$$\text{信息保留率} = \frac{\sum_{i=1}^{k}\sigma_i^2}{\sum_{i=1}^{n}\sigma_i^2}$$
通常,前 10% 的奇异值就能保留 90% 以上的信息!
原始图像 (512×512) → SVD 分解 → 保留前 50 个奇异值 → 压缩后图像
压缩比:$\frac{512 \times 512}{512 \times 50 + 50 + 50 \times 512} \approx 5.1$ 倍
4.2 推荐系统 原理 : 用户 - 物品评分矩阵 R 的 SVD 分解可以发现隐含的用户偏好和物品特征
$$R_{m \times n} = U_{m \times k} \Sigma_{k \times k} V^T_{k \times n}$$
U: 用户的隐含特征(如"喜欢动作片"、"偏好喜剧")
V: 物品的隐含特征(如"动作片"、"爱情片")
Σ: 每个隐含特征的重要程度
$$\hat{r}_{ij} = u_i^T \Sigma v_j$$
4.3 自然语言处理(LSA 潜在语义分析) 原理 : 文档 - 词项矩阵的 SVD 可以发现词语和文档的潜在主题
$$X_{m \times n} = U_{m \times k} \Sigma_{k \times k} V^T_{k \times n}$$
4.4 图像处理
4.5 信号处理
4.6 求解线性方程组 其中 $\Sigma^+$ 是 Σ 的伪逆(非零元素取倒数后转置)
$$x = A^+ b = V\Sigma^+ U^T b$$
4.7 平面拟合
断层点云 → SVD 分解 → 法向量 → 走向倾角
5. Python 代码实现
5.1 NumPy 内置 SVD import numpy as np
A = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]])
U, sigma, VT = np.linalg.svd(A, full_matrices=False )
print ("U 矩阵 (左奇异向量):" )
print (U)
print ("\n奇异值:" )
print (sigma)
print ("\nV^T 矩阵 (右奇异向量的转置):" )
print (VT)
Sigma = np.diag(sigma)
A_reconstructed = U @ Sigma @ VT
print ("\n重构的矩阵 A:" )
print (A_reconstructed)
U 矩阵 (左奇异向量):
[[-0.2298477 0.88346102]
[-0.52474482 0.24078249]
[-0.81964194 -0.40189603]]
奇异值:
[9.52551809 0.51430058 ]
V^T 矩阵 (右奇异向量的转置):
[[-0.61962948 -0.78489445]
[-0.78489445 0.61962948]]
重构的矩阵 A:
[[1. 2.]
[3. 4.]
[5. 6.]]
5.2 图像压缩示例 import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
img = Image.open ('image.jpg' ).convert('L' )
img_array = np.array(img)
U, sigma, VT = np.linalg.svd(img_array, full_matrices=False )
k_values = [5 ,10 ,20 ,50 ,100 ]
fig, axes = plt.subplots(2 ,3 , figsize=(15 ,10 ))
axes = axes.flatten()
axes[0 ].imshow(img_array, cmap='gray' )
axes[0 ].set_title('原图' )
axes[0 ].axis('off' )
for i, k in enumerate (k_values):
img_approx = U[:,:k] @ np.diag(sigma[:k]) @ VT[:k,:]
original_size = img_array.shape[0 ]* img_array.shape[1 ]
compressed_size = k *(img_array.shape[0 ]+ img_array.shape[1 ]+1 )
compression_ratio = original_size / compressed_size
axes[i+1 ].imshow(img_approx, cmap='gray' )
axes[i+1 ].set_title(f'k={k} , 压缩比={compression_ratio:.1 f} x' )
axes[i+1 ].axis('off' )
plt.tight_layout()
plt.show()
5.3 数据降维示例 import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
U, sigma, VT = np.linalg.svd(X - X.mean(axis=0 ), full_matrices=False )
X_reduced = U[:,:2 ] @ np.diag(sigma[:2 ])
plt.figure(figsize=(8 ,6 ))
colors =['red' ,'green' ,'blue' ]
for i in range (3 ):
mask =(y == i)
plt.scatter(X_reduced[mask,0 ], X_reduced[mask,1 ], c=colors[i], label=iris.target_names[i], alpha=0.6 )
plt.xlabel('第 1 主成分' )
plt.ylabel('第 2 主成分' )
plt.title('SVD 降维:4 维 → 2 维' )
plt.legend()
plt.grid(True )
plt.show()
info_retained =(sigma[:2 ]**2 ).sum ()/(sigma**2 ).sum ()
print (f"前 2 个主成分保留的信息:{info_retained*100 :.2 f} %" )
5.4 最小二乘拟合 import numpy as np
x = np.linspace(0 ,10 ,100 )
y_true =2 * x +3
y_noisy = y_true + np.random.randn(100 )*2
A = [x, 1 ]
A = np.column_stack([x, np.ones(len (x))])
U, sigma, VT = np.linalg.svd(A, full_matrices=False )
Sigma_inv = np.diag(1 / sigma)
A_pinv = VT.T @ Sigma_inv @ U.T
params = A_pinv @ y_noisy
print (f"拟合结果:y = {params[0 ]:.2 f} x + {params[1 ]:.2 f} " )
print (f"真实参数:y = 2.00x + 3.00" )
参考资料
论文与书籍
Golub, G. H., & Van Loan, C. F. (2013). Matrix Computations . 4th ed.
Strang, G. (2016). Introduction to Linear Algebra . 5th ed.
Klema, V., & Laub, A. (1980). "The singular value decomposition: Its computation and some applications."
在线资源 微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online