如何让奇异值分解(SVD)变得不“奇异”?

简介: 如何让奇异值分解(SVD)变得不“奇异”?

在之前的一篇文章:划重点!通俗解释协方差与相关系数,红色石头为大家通俗化地讲解了协方差是如何定义的,以及如何直观理解协方差,并且比较了协方差与相关系数的关系。


本文红色石头将继续使用白话语言,介绍机器学习中应用十分广泛的矩阵分解方法:奇异值分解(SVD)。本文不注重详细的数学推导,只注重感性的理解以及如何在实际应用中使用它们。


1  普通方阵的矩阵分解(EVD)


我们知道如果一个矩阵 A 是方阵,即行列维度相同(mxm),一般来说可以对 A 进行特征分解:


image.png


其中,U 的列向量是 A 的特征向量,Λ 是对角矩阵,Λ 对角元素是对应特征向量的特征值。


举个简单的例子,例如方阵 A 为:


image.png


那么对其进行特征分解,相应的 Python 代码为:


import numpy as np
A = np.array([[2,2],[1,2]])
lamda,U=np.linalg.eig(A)
print('方阵 A: ',A)
print('特征值 lamda: ',lamda)
print('特征向量 U: ',U)


运行输出:


方阵 A: [[2 2]
   [1 2]]
特征值 lamda: [ 3.41421356 0.58578644]
特征向量 U: [[ 0.81649658 -0.81649658]
   [ 0.57735027 0.57735027]]

特征分解就是把 A 拆分,如下所示:


image.png


其中,特征值 λ1=3.41421356,对应的特征向量 u1=[0.81649658 0.57735027];特征值 λ2=0.58578644,对应的特征向量 u2=[-0.81649658 0.57735027],特征向量均为列向量。


值得注意的是,特征向量都是单位矩阵,相互之间是线性无关的,但是并不正交。得出的结论是对于任意方阵,不同特征值对应的特征向量必然线性无关,但是不一定正交。


02  对称矩阵的矩阵分解(EVD)


image.pngimage.pngimage.png

image.png

那么对其进行特征分解,相应的 Python 代码为:


A = np.array([[2,1],[1,1]])
lamda,U=np.linalg.eig(A)
print('方阵 A: ',A)
print('特征值 lamda: ',lamda)
print('特征向量 U: ',U)


运行输出:


方阵 A:  [[2 1]

[1 1]]

特征值 lamda:  [ 2.61803399  0.38196601]

特征向量 U:  [[ 0.85065081 -0.52573111]

[ 0.52573111  0.85065081]]

特征分解就是把 A 拆分,如下所示:


image.png


其中,特征值 λ1=2.61803399,对应的特征向量 u1=[0.85065081 0.52573111];特征值 λ2=0.38196601,对应的特征向量 u2=[-0.52573111 0.85065081],特征向量均为列向量。


注意,我们发现对阵矩阵的分解和非对称矩阵的分解除了公式不同之外,特征向量也有不同的特性。对称矩阵的不同特征值对应的特征向量不仅线性无关,而且是相互正交的。什么是正交呢?就是特征向量内积为零。验证如下:


0.85065081 * -0.52573111 + 0.52573111 * 0.85065081 = 0\

image.png

3  奇异值分解(SVD)


我们发现,在矩阵分解里的 A 是方阵或者是对称矩阵,行列维度都是相同的。但是实际应用中,很多矩阵都是非方阵、非对称的。那么如何对这类矩阵进行分解呢?因此,我们就引入了针对维度为 mxn 矩阵的分解方法,称之为奇异值分解(Singular Value Decomposition)。


假设矩阵 A 的维度为 mxn,虽然 A 不是方阵,但是下面的矩阵却是方阵,且维度分别为 mxm、nxn。


image.png


因此,我们就可以分别对上面的方阵进行分解:


image.png


其中,Λ1 和 Λ2 是对焦矩阵,且对角线上非零元素均相同,即两个方阵具有相同的非零特征值,特征值令为 σ1, σ2, ... , σk。值得注意的是,k<=m 且 k<=n。


根据 σ1, σ2, ... , σk 就可以得到矩阵 A 的特征值为:

image.png

其中,P 称为左奇异矩阵,维度是 mxm,Q 称为右奇异矩阵,维度是 nxn。Λ 并不是方阵,其维度为 mxn,Λ 对角线上的非零元素就是 A 的特征值 λ1, λ2, ... , λk。图形化表示奇异值分解如下图所示:

image.png

image.png

image.png

4  如何形象化理解 SVD


奇异值分解到底有什么用呢?如何形象化地理解奇异值?我们一起来看下面的例子。


首先放上男神的照片:

image.png

image.pngimage.pngimage.pngimage.pngimage.png

可见,取前 50 个最大奇异值来重构图像时,已经非常清晰了。我们得到和原图差别不大的图像。也就是说,随着选择的奇异值的增加,重构的图像越来越接近原图像。


基于这个原理,奇异值分解可以用来进行图片压缩。例如在本例中,原始图片的维度是 870x870,总共需要保存的像素值是:870x870=756900。若使用 SVD,取前 50 个最大的奇异值即可,则总共需要存储的元素个数为:


(870+1+870)x50=87050


显然,所需存储量大大减小了。在需要存储许多高清图片,而存储空间有限的情况下,就可以利用 SVD,保留奇异值最大的若干项,舍去奇异值较小的项即可。


值得一提的是,奇异值从大到小衰减得特别快,在很多情况下,前 10% 甚至 1% 的奇异值的和就占了全部的奇异值之和的 99% 以上了。这对于数据压缩来说是个好事。


SVD 数据压缩的算法图示如下:


image.png


SVD 数据压缩的示例代码为:


from skimage import io
import matplotlib.pyplot as plt
from PIL import Image
img=io.imread('./ng.jpg')
m,n = img.shape
io.imshow(img)
plt.show()
P, L, Q = np.linalg.svd(img)
tmp = np.diag(L)
if m < n:
   d = np.hstack((tmp,np.zeros((m,n-m))))
else:
   d = np.vstack((tmp,np.zeros((m-n,n))))
# k = 50
img2 = P[:,:50].dot(d[:50,:50]).dot(Q[:50,:])
io.imshow(np.uint8(img2))
plt.show()
tmp = np.uint8(img2)
im = Image.fromarray(tmp)
im.save("out.jpg")

现在,你已经完全了解了奇异值分解了吧。是不是挺简单也挺有意思呢?

相关文章
|
数据采集 存储 测试技术
Python生成随机数插件Faker的用法
Python生成随机数插件Faker的用法
927 0
|
1月前
|
人工智能 JavaScript 程序员
DeepSeek 官方竟然偷偷做了 Harness 桌面端,我已经用上了。。
DeepSeek 官方竟然下场给 DSH 做桌面端了,期待一波,可能是未来最好的 AI 编程工具么?2 分钟教你怎么提前用上,吃一波螃蟹
987 0
|
7月前
|
人工智能 运维 网络安全
保姆级级图文教程!2026年阿里云轻量服务器部署OpenClaw(Clawdbot)指南
2026年,OpenClaw(曾用名Clawdbot)已经成为最受欢迎的开源AI自动化代理平台,凭借轻量化运行、自然语言驱动、Skills插件扩展等优势,广泛用于文件管理、信息检索、定时任务、网页自动化、内容处理等日常效率场景。对于零基础用户而言,阿里云轻量应用服务器是部署OpenClaw的最优选择:操作简单、性价比高、环境稳定、自带官方镜像,全程无需复杂运维,小白也能在15分钟内完成从部署到上线的全流程。
2626 3
|
3月前
|
数据采集 人工智能 搜索推荐
【2026 实战】GEO 与 SEO 的核心差异:面向 AI 搜索的下一代优化体系全解析
2026年,搜索生态剧变:用户从搜关键词转向向AI提问。SEO优化爬虫与排名,GEO(生成式引擎优化)则面向大模型,通过结构化数据、语义向量和知识库,争夺AI答案中的“信任票”。本文从开发者视角拆解GEO与SEO的技术差异、指标演进及工程落地路径——让内容既对爬虫友好,更对模型友好。(239字)
443 1
|
4月前
|
人工智能 编解码 JSON
🐴 HappyHorse 1.1上线阿里云百炼:AI视频生成模型全功能使用指南
阿里云百炼平台近期迎来重要更新,阿里自研的AI视频生成模型HappyHorse 1.1正式上线,为个人创作者与企业用户提供了专业级的视频生成能力。该模型基于15亿参数单流Transformer架构,实现文本、图像、视频、音频的统一编码与原生同步生成,在动态表现力、主体一致性、指令遵循、视觉质感与音频能力五大维度完成系统性升级,可满足短剧创作、广告制作、直播带货、内容营销等多场景需求。本文将从核心能力、开通流程、调用方式、参数配置、提示词技巧与应用场景等方面,全面解析HappyHorse 1.1在阿里云百炼的使用方法,帮助用户快速掌握这款高效视频生成工具。
504 0
|
11月前
|
人工智能 自然语言处理 搜索推荐
2025年11月,中国数字人平台关键领域的创新应用模式
数字人技术融合AI与图形学,重塑政务、医疗、教育、文化等领域交互模式。凭借拟真形象与智能交互,实现从导诊到心理辅导、从历史人物复现到个性化教学的多元应用,推动产业落地与社会服务升级。
|
11月前
|
Linux 网络安全 数据安全/隐私保护
【全网最全最详细】Linux下私服Nexus安装教程
本文介绍Nexus私服的安装与配置步骤:下载解压包、创建专用用户、禁止root启动、配置权限、启动服务并开放防火墙端口,最后通过浏览器访问管理界面并获取初始密码完成初始化设置。
659 0
|
12月前
|
JSON API 开发者
1688按关键词搜索商品的API接口技术指南
本文介绍如何使用1688开放平台API实现商品关键词搜索,涵盖API概述、权限申请、调用步骤、Python代码示例及注意事项,助力开发者高效集成商品搜索功能,适用于电商自动化、价格监控等场景,内容基于官方文档,确保准确可靠。
1525 0
|
小程序 Android开发 数据安全/隐私保护
八米云PCDN-N1盒子、机顶盒等设备-小白保姆式超详细刷机教程
本文介绍了如何为魔百盒CM211-1等S905系列机顶盒进行线刷准备及步骤,包括所需工具、线刷流程、短接刷机、写入八米系统等详细操作,适用于刷入安卓9系统。特别提示,刷过其他系统的用户可简化部分步骤。
4824 0
八米云PCDN-N1盒子、机顶盒等设备-小白保姆式超详细刷机教程