精简易懂,30 分钟学会 SVD 矩阵分解,很强!

article/2025/9/26 22:01:17

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法。

它能够将一个任意形状的矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积。

SVD分解具有非常深刻的几何含义。矩阵实际上对应着一种线性变换,一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵的操作效果可以分解成一次旋转,一次拉伸和维度改变,以及另外一次旋转三者作用效果的合成。

SVD分解通常用于数据压缩和数据降维。用于数据降维时,既可以对列降维,也可以对行降维,其中对列的降维等价于PCA的降维。

不仅如此,SVD算法还可以用于在声音和图像处理中剥离背景信号,在推荐算法中也经常出现它的身影。

一,SVD矩阵分解简介

SVD分解将任意矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积。

对角矩阵的对角元称为矩阵的奇异值,可以证明,奇异值总是大于等于0的。

当对角矩阵的奇异值按从大到小排列时,SVD分解是唯一的。

SVD分解有着非常深刻的几何含义。

矩阵实际上是对应着一种线性变换。一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵的操作效果可以分解成一次旋转,一次拉伸和维度改变,以及另外一次旋转三者作用效果的合成。

注意正交矩阵和作用到向量后是不会改变向量长度的,所以对应着旋转变换。

二,SVD分解的数学推演

 可以推出

依然是对角矩阵,又U为正交矩阵。

所以 为AA^T的相似对角矩阵,其对角元为AA^T的特征值,U由其对应特征向量构成,这些向量称为A的左奇异向量。

因此的对角元为AA^T特征值的平方根,称之为矩阵A的奇异值。

类似地V由A^TA的特征向量构成,这些向量称为A的右奇异向量。

三,SVD分解和数据压缩

奇异值描述了矩阵对应的拉伸变换在各个方向的比例,是矩阵的重要特征。

奇异值的分布通常非常不均,在很多的情况下前10%甚至1%的奇异值之和就占了全部奇异值之和的99%以上。

因此我们可以用前个大的奇异值来近似的描述矩阵。

这就是SVD分解用来进行数据压缩的原理。

假设 m = 10000,n = 8000,原来存储矩阵A需要存储8000万个数字,如果经过奇异值分解发现前100个奇异值贡献了99%的奇异值之和,于是可以近似只保留这100个奇异值及对应的左右奇异向量,那么只需要保留100+10000×100+100×8000= 180.01万个数字,只有原来的不到2.3%。
# 下面的范例示范SVD分解用于图片数据压缩。
%matplotlib inline 
%config InlineBackend.figure_format = 'svg'
import numpy as np 
from matplotlib import pyplot as plt
from skimage import datadef compressBySVD(img,r):u,s,vt = np.linalg.svd(img)ur = u[:,0:r]sr = s[0:r]vtr = vt[0:r,:]return (ur,sr,vtr)def rebuildFromSVD(ur,sr,vtr):img = ur@np.diag(sr)@vtrreturn(img)img = data.camera()/255.0plt.figure(figsize=(10,8)) 
for i,r in enumerate([5,10,20,30,40,50,100,200],start = 1):ur,sr,vtr = compressBySVD(img,r)compress_ratio = (np.product(ur.shape) + len(sr) + np.product(vtr.shape))/np.product(img.shape)img_rebuild = rebuildFromSVD(ur,sr,vtr)ax=plt.subplot(3,3,i)ax.imshow(img_rebuild,cmap = "gray")ax.set_title("r=%d"%r+", compress_ratio=%.2f"%compress_ratio)ax.set_xticks([])ax.set_yticks([]) ax = plt.subplot(3,3,9)
ax.imshow(img,cmap = "gray")
ax.set_title("r = 512, original image")
ax.set_xticks([])
ax.set_yticks([]) plt.show()



四,SVD分解和PCA降维

PCA降维可以看成是SVD分解的一个应用。PCA降维使用的变换矩阵恰好是SVD分解的右奇异矩阵。

实际上,由于SVD分解存在着无需通过计算特征值和特征向量的可并行的数值迭代计算算法,sklearn的PCA降维算法正是通过SVD分解计算的。

下面证明SVD分解的右奇异向量构成的矩阵恰好是PCA算法所需要的正交变换矩阵。

假定PCA对应的正交变换矩阵为,根据PCA算法的数学原理,

由协方差矩阵 的各个特征向量组成,它能够将协方差矩阵相似对角化。

其中为的相似对角矩阵,且对角元由大到小排列。

利用的SVD矩阵分解:

我们有

根据SVD分解的数学原理,也是 的相似对角矩阵,且对角元由大到小排列。

于是有:

于是右奇异向量构成的矩阵 ???? 恰好是PCA算法所需要的正交变换矩阵 ????。

注意到PCA算法实际上是一种列降维的方法,实际上利用SVD分解的左奇异矩阵也可以对矩阵进行行降维。

# 演示SVD用于PCA降维的计算%matplotlib inline 
%config InlineBackend.figure_format = 'svg'
import numpy as np 
from sklearn.decomposition import PCAfrom matplotlib import pyplot as plt
from skimage import dataX = np.array([[-1.0, -3, -2], [-2, -1, -3], [-3, -2, -5], [2, 1, 3], [6, 1, 3], [2, 2, 3]])pca = PCA(n_components= 2)
X_new = pca.fit_transform(X)
print("\ndecomposition by pca:")
print("singular value:")
print(pca.singular_values_)
print("X_new:")
print(X_new)print("\ndecomposition by svd:")
U,S,Vt = np.linalg.svd(X-X.mean(axis = 0))
print("singular value:\n",S[:2])
print("X_new:")
print(np.dot(X-X.mean(axis = 0),np.transpose(Vt)[:,0:2]))# 注:降维结果中正负号的差异是因为PCA调整了SVD分解后的U和Vt符号以保持各列最大值取正

输出如下:

decomposition by pca:
singular value:
[11.31375337  2.89544001]
X_new:
[[ 3.23378083  1.06346839][ 3.88607412 -0.50763321][ 6.25267378  0.08479886][-3.50509914 -0.96584476][-6.02398361  1.89494314][-3.84344598 -1.56973242]]decomposition by svd:
singular value:[11.31375337  2.89544001]
X_new:
[[-3.23378083 -1.06346839][-3.88607412  0.50763321][-6.25267378 -0.08479886][ 3.50509914  0.96584476][ 6.02398361 -1.89494314][ 3.84344598  1.56973242]]

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


http://chatgpt.dhexx.cn/article/HVI2mrJm.shtml

相关文章

矩阵(一):SVD分解

文章目录 0 参考链接(尊重原著)1 SVD分解原理2 SVD分解意义3 SVD分解的应用4 SVD数学举例5 为什么Ax0的解为最小奇异值对应的向量? 0 参考链接(尊重原著) 下面这个讲的很好很全面 视觉SLAM常见的QR分解SVD分解等矩阵分…

详解SVD分解过程

转 如何让奇异值分解(SVD)变得不“奇异”? 红色石头 发布于 2018-08-29 分类:机器学习 阅读(144) 评论(0) 如何让奇异值分解(SVD)变得不“奇异”?-红色石头的个人博客 http://redstonewill.com/1529/ 在之前的一篇文章:通俗解…

奇异值分解(SVD)原理详解及推导

转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充的,特别是关于矩阵和映射之间的对应关系。前段时间看了国外的一篇文章,叫A S…

奇异值分解(SVD)原理

奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总…

SVD(奇异值分解)

一、SVD(奇异值分解 Singular Value Decomposition) 1.1、基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2&#xff0…

SVD分解

一、SVD简介 Singular Value Decomposition(奇异值分解,SVD)是一种重要的矩阵分解技术,可以将一个矩阵分解为三个矩阵的乘积。SVD的应用广泛,包括数据降维、矩阵逆运算、推荐系统等领域。 给定一个矩阵A,SV…

如何快速搭建个人网站(服务器配置篇)

关于服务器的购买和域名注册可以参考我的这篇博客 在使用之前,建议小白用户先下载一个Vmware 安装一个Ubuntu的虚拟环境学习一下linux的基础命令。 一、远程服务器的连接 服务器购买好了以后我们需要进行远程连接我们的服务器, 我个人推荐windows用…

在废旧手机里搭建个人服务器

点击跳转微信公众号原文链接 欢迎关注公众号,会不定时发些有趣的干货文章,以及一些记录性的技术文章! 正文开始: 一、目的:给手机装上Linux系统,充当服务器使用 二、流程: 1、手机装好相关软件…

个人搭建网站的服务器选择

关于这方面之前一直准备分享一下心得,由于一直比较忙,各种想写的就各种耽搁了,今天给大家总结一下个人或小型企业站该如何选择网站服务器 首先,先弄清楚自己的需求和用途: 1、是建立一个静态页面还是动态页面&#xff…

如何利用云服务器搭建个人网站

去阿里云进入官网 aliyun.com 注册账号 小林同学在这里用阿里云演示,大家也可以去腾讯云、百度云注册等大型知名企业,步骤雷同,看个人喜欢 注册完,完善个人信息,进行实名认证 主页面 点击 最新活动 并找到 新手上路 和…

【Linux】零成本在家搭建自己的私人服务器解决方案

我这个人自小时候以来就特喜欢永久且免费的东西,也因此被骗过(花巨款买了永久超级会员最后就十几天)。 长大后骨子里也是喜欢永久且免费的东西,所以我不买服务器,用GitHubPage或者GiteePage搭建自己的静态私人博客&…

如何组装、搭建一台永久运行的个人服务器?

点击关注公众号,实用技术文章及时了解 来源:segmentfault.com/a/1190000021143144 一、前言 由于本人在这段时候,看到了一个叫做树莓派的东东,初步了解之后觉得很有意思,于是想把整个过程记录下来。 二、树莓派是什么&…

完全免费快速搭建个人www服务器

想拥有自己的web服务器吗?想把服务器放到自己家里吗?通过ADSL拨号也能建立个人的服务器吗?本文告诉你答案。 要建立自己的web服务器,需要两个最重要的工作: 1 让别人知道你的主机 目前访问Internet上主机的方式主要有…

用服务器建立个人网站

首先,我们需要购买云服务器和域名。 域名建议用.com后缀的(一般五十左右),想要便宜的域名可以买.top等后缀的(一般几块钱)。 点击这里购买域名 三丰云服务器的话,根据自己的需要购买&#xf…

家庭宽带搭建个人服务器

家庭宽带搭建个人服务器 家庭宽带搭建个人服务器准备1.公网IP1.1光猫改桥接模式 2.一台PC主机 安装PVE系统1.下载PVE镜像文件2.制作U盘启动盘 PVE安装Centos1.创建虚拟机2.启动虚拟机 完成centos安装步骤即可 域名解析实现公网访问1.测试公网连接 家庭宽带搭建个人服务器 想必…

家用宽带搭建个人服务器(一)

本文主要详记从 安装电信宽带 到使用动态公网IP 访问家里电脑的 web服务 写在前头 以前不知道在哪看过家用宽带搭建个人网站这种文章,所以心里一直对这个事念念不忘,毕竟万物皆可薅,能免费就免费,要用有限的生命好好折腾一番 1.…

电脑搭建个人服务器

电脑搭建个人服务器 #一.准备工作二.设置Xampp三.安装宝塔面板 #一.准备工作 1.下载Xampp和kodbox.1.22 2.下载宝塔面板 二.设置Xampp 1.打开Xampp,找到安装路径下的,如图打开xampp-control.exe 2.打开页面 2.如果点击Apache的start开启不成功的话…

搭建个人云服务器

创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境MySQL数据库作为程序运行环境。申请地址为: 注册地址:http://www.sinacloud.com/public/login/inviter/gaimrn-mddmzeKWrhKWvrICun2Z_eIlnf6Kqdg.ht…

【个人网站搭建】服务器、域名准备

【个人网站搭建】服务器、域名准备 用最简单的方式,带你上线自己的网站!前言 建网站本身是一个很大的工程,涉及前端页面的搭建,网站数据的存储,还要购置服务器资源,域名等。我们要上线个人网站&#xff0…

家用宽带搭建个人服务器(二)

本文主要详记免费二级域名注册和免费DDNS解析 写在前头 近几年国内注册域名需要备案,域名解析服务商都陆续需要收费了,对于我这种想简单玩玩的人来说实在是太麻烦了(主要是费钱),花了点时间找到了免费域名注册和DDNS解析 本文基于…