【老计带你懂线性代数】11:SVD奇异值分解,线代皇冠上的明珠

📅 发布时间:2026/10/18 14:29:55
【老计带你懂线性代数】11:SVD奇异值分解,线代皇冠上的明珠
【老计带你懂线性代数】11SVD奇异值分解线代皇冠上的明珠开头一个更通用的分解上一篇的特征分解很强大但有个硬限制它只能拆方阵。可现实里大量重要的矩阵根本不是方阵一份1000个用户乘500个商品的评分表、一张高乘宽的图片、一个样本乘特征的数据集全是长方形的。有没有一种分解能把任意形状的矩阵都拆开有它就是SVD奇异值分解被誉为线性代数皇冠上的明珠。它是特征分解的终极推广任何矩阵都能做而且在AI里应用极广降维、推荐、压缩、去噪、语义分析处处有它。这一篇把它讲透你会发现它既通用又优雅是整个系列里最值得掌握的工具之一。SVD在拆什么旋转、缩放、再旋转SVD的核心思想一句话任何一个矩阵所做的变换都可以拆解成三个简单动作先旋转、再沿各方向缩放、再旋转。写成公式是矩阵 U 乘 S 乘 V的转置你不用记符号记住三个动作的角色就行第一个旋转V的转置把输入空间转到一个合适的角度。中间的缩放S沿各个坐标轴按不同倍数拉伸或压缩。这些缩放倍数就是大名鼎鼎的奇异值。第二个旋转U再转到输出空间该在的角度。关键在中间那个缩放奇异值。它们衡量这个变换在各个方向上用力多大、多重要。奇异值大的方向是这个矩阵最主要的方向、最重要的信息奇异值小的方向是次要的、甚至可忽略的。奇异值通常按从大到小排列第一个最重要往后越来越次要。打个比方任何一个复杂的变换SVD都把它翻译成三步走摆正姿势旋转、按重要程度分别拉伸各个方向缩放奇异值就是各方向的重要程度、再摆到最终姿势旋转。再复杂的矩阵SVD都能这么拆开看清它每个方向使了多大劲。为什么SVD比特征分解更通用特征分解要求方阵还要求矩阵性格好可对角化。SVD没有任何限制任意形状、任意矩阵都能分解这就是它的通用性所在。而且SVD和特征分解、和PCA有深刻联系对一个数据矩阵直接做SVD得到的结果和对它的协方差矩阵做特征分解也就是PCA本质是相通的。SVD的奇异值的平方正对应着PCA里的特征值方差SVD的右奇异向量正对应着PCA的主成分方向。实践中很多PCA的实现底层就是用SVD算的因为SVD数值上更稳定、更通用。所以你可以把SVD理解成PCA的一个更强大、更通用的引擎。顺便说说它为什么配得上皇冠上的明珠这个名号。线性代数里各种概念向量、矩阵、秩、特征值、变换到了SVD这里像是被一根线串了起来。SVD同时告诉你一个矩阵的秩非零奇异值的个数、它最重要的方向大奇异值对应的向量、它把空间拉伸压缩的程度奇异值大小、以及怎么用低维近似它低秩近似几乎一个分解就把前面几篇讲的东西全兜住了。更难得的是它对任意矩阵都成立没有任何限制。这种既极致通用、又信息量巨大、还数值稳定的性质让它成了线代里最有用、最优雅的结果之一无论理论还是工程都绕不开。你不需要会手工算SVD那很繁琐交给NumPy但一定要理解它拆出来的三部分各是什么意思、奇异值代表重要性、留大扔小能压缩这些直觉在AI里价值连城。用SVD降维和压缩只留大奇异值SVD最实用的能力是低秩近似说白了就是降维和压缩思路特别漂亮既然奇异值按重要性从大到小排那只保留前几个最大的奇异值和对应的向量扔掉后面一大堆小奇异值就能用很少的信息近似重建整个矩阵。丢掉的小奇异值方向信息量少重建出来的矩阵和原来几乎一样却省了大量存储。这正是数据压缩的原理。一张图片是一个矩阵做SVD后前面少数几个大奇异值就抓住了图片的主要结构大色块、主要轮廓后面成百上千个小奇异值只贡献一些细节。只留前几十个奇异值就能把图片压缩到原来的很小一部分肉眼看几乎没差别。这一篇的代码就会演示这个。打个比方描述一幅画SVD告诉你哪几笔是主要的轮廓大奇异值、哪些是可有可无的细节小奇异值。你只临摹那几笔主要的就能画出九成像的赝品还省了大量功夫。留几笔、留多像你自己权衡。这个低秩近似的思想在大模型时代焕发了新的生命值得专门一提就是现在微调大模型最流行的技术之一LoRA低秩适配。大模型的权重矩阵极其巨大全量微调要更新的参数量惊人、又费显存又费钱。LoRA的巧思是微调时不去动那个巨大的原权重矩阵而是用两个小得多的矩阵相乘来表示权重的改动量因为这个改动量往往是低秩的没那么复杂用低秩近似就够了。这样要训练的参数一下子少了成百上千倍普通人用一张消费级显卡就能微调大模型。你看SVD揭示的一个大矩阵常常可以用低秩的方式很好地近似这个洞察几十年后成了大模型平民化微调的理论支柱。这正是线性代数的迷人之处一个看似古老的分解思想会在最前沿的技术里以新的面貌复活。理解了低秩近似你就能看懂LoRA为什么行、为什么省这是只停留在应用层面看不透的。这也再次印证了这个系列的主张把数学地基打牢前沿技术对你就不再是天书。输入和输出长什么样输入任意一个矩阵不必是方阵。输出三部分U左奇异向量、S奇异值一串从大到小的数、V的转置右奇异向量。NumPy里用np.linalg.svd一次求出。降维就是只取前k个。上代码SVD分解 用它压缩图片# 依赖pip install numpyimportnumpyasnp# 1.对一个普通矩阵做SVDAnp.array([[1,2,3],[4,5,6]])# 2x3的长方形矩阵,特征分解做不了,SVD可以U,S,Vtnp.linalg.svd(A)print(原矩阵形状:,A.shape)print(奇异值(从大到小):,np.round(S,3))print(U形状:,U.shape, Vt形状:,Vt.shape)# 2.用SVD做低秩近似(压缩):只保留最大的1个奇异值,重建矩阵k1A_approxU[:,:k] np.diag(S[:k]) Vt[:k,:]print(\n只用前1个奇异值重建的矩阵:\n,np.round(A_approx,2))print(原矩阵:\n,A)print(已经很接近了,只用了一小部分信息)# 3.演示图片压缩:造一张有明显结构的图片矩阵np.random.seed(0)imgnp.zeros((50,50))img[10:40,10:40]1# 中间一个方块(主要结构)imgnp.random.randn(50,50)*0.1# 加点噪声(细节)U,S,Vtnp.linalg.svd(img)print(\n图片是50x50,共有,len(S),个奇异值)# 分别用前5、前20个奇异值重建,看用多少信息够forkin[5,20]:approxU[:,:k] np.diag(S[:k]) Vt[:k,:]errornp.linalg.norm(img-approx)/np.linalg.norm(img)# 存储量:原图50x502500个数; 压缩后只需k*(50501)个数compressedk*(50501)print(f用前{k}个奇异值: 重建误差{error:.3f}, 存储量从2500降到{compressed})运行输出示例图片含随机噪声每次略有差异原矩阵形状: (2, 3) 奇异值(从大到小): [9.526 0.514] U形状: (2, 2) Vt形状: (3, 3) 只用前1个奇异值重建的矩阵: [[1.57 2.06 2.54] [3.68 4.83 5.98]] 原矩阵: [[1 2 3] [4 5 6]] 已经很接近了,只用了一小部分信息 图片是50x50,共有 50 个奇异值 用前5个奇异值: 重建误差0.087, 存储量从2500降到505 用前20个奇异值: 重建误差0.042, 存储量从2500降到2020运行你会看到一个2乘3的长方形矩阵特征分解做不了被SVD顺利拆开奇异值从大到小排只用最大的1个奇异值就能近似重建整个矩阵那张50乘50的图片只用前5个奇异值重建误差就很小、存储量从2500降到505实现了压缩。核心就是奇异值按重要性排序留大扔小就能用很少的信息近似还原这就是SVD降维和压缩的威力。在AI里怎么用SVD是AI里应用极广的一件利器推荐系统的矩阵分解把用户乘物品的稀疏评分矩阵用SVD分解得到用户和物品的隐向量预测缺失评分。这是下一篇的主题呼应《老计带你懂AI算法》的协同过滤篇。降维SVD是PCA的底层引擎前面讲过。数据压缩与去噪图像、信号压缩扔掉小奇异值就去了噪。潜在语义分析LSA对词乘文档矩阵做SVD挖出文档的潜在主题是早期语义分析的核心。大模型里的低秩技术如今微调大模型的LoRA低秩适配思想就和低秩近似一脉相承用两个小矩阵近似一个大矩阵的更新。常见误区SVD对任意矩阵都能做这是它比特征分解强的地方别只在方阵上想它。奇异值一定非负、且按大小排序第一个最重要这是低秩近似的基础。低秩近似不是无损留的奇异值越少压缩越狠、但误差越大要在压缩率和质量间权衡。SVD和PCA不是两回事PCA可以用SVD实现理解了SVD就更懂PCA。小结与承上启下SVD把任意矩阵拆成旋转、缩放、旋转三部分缩放倍数就是奇异值是特征分解的终极推广。奇异值衡量各方向的重要程度从大到小排大的是主结构、小的是细节。低秩近似只留大奇异值用很少信息近似重建实现降维和压缩。和PCA的关系SVD是PCA更通用稳定的引擎AI里推荐、压缩、去噪、LSA、以及大模型微调的LoRA都用它。SVD能把矩阵拆成隐藏的成分这个思想直接通向AI里一个巨大的应用领域把稀疏的大矩阵拆成稠密的隐向量。下一篇讲矩阵分解与嵌入看推荐系统怎么靠它猜你喜欢什么、以及词嵌入的线代本质把万物变向量这条主线彻底收拢。我们下一篇见一起把万物变向量这条主线彻底收拢。延伸阅读3Blue1Brown 及 MIT 的线性代数课程都有SVD的经典讲解https://www.3blue1brown.com/topics/linear-algebraNumPy 官方文档np.linalg.svdhttps://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.htmlSVD图像压缩与LoRA可分别按关键词SVD image compression、LoRA low-rank adaptation检索说明以上为官方与经典公开资料地址可能随版本调整如打不开可用标题搜索。