详解SVD分解过程

article/2025/9/26 22:23:52

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


 

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

 

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

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

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

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

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

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

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

运行输出:

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

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

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

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

2.对称矩阵的矩阵分解(EVD)

如果方阵 A 是对称矩阵,例如:

对称矩阵特征分解满足以下公式:

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

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

运行输出:

方阵 A: [[2 1]
[1 1]]
特征值 lamda: [ 2.61803399 0.38196601]
特征向量 U: [[ 0.85065081 -0.52573111]
[ 0.52573111 0.85065081]]

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

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

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

0.85065081∗−0.52573111+0.52573111∗0.85065081=00.85065081 * -0.52573111 + 0.52573111 * 0.85065081 = 00.85065081∗−0.52573111+0.52573111∗0.85065081=0

重点来了,对称矩阵 A 经过矩阵分解之后,可以写成以下形式:

对上式进行验证:

这种分解形式非常有用,待会红色石头即将介绍。

3. 奇异值分解(SVD)

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

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

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

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

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

接下来,我们就能够得到奇异值分解的公式:

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

举个简单的例子来说明,令 A 为 3×2 的矩阵:

则有:

计算得到特征向量 P 和对应的特征值 σ 为:

然后,有:

计算得到特征向量 Q 和对应的特征值 σ 为:

则我们看可以得到 A 的特征值为:

最后,整合矩阵相乘结果,满足奇异值分解公式。

奇异值分解可以写成以下和的形式:

其中,p1 和 q1 分别为左奇异矩阵和右奇异矩阵的特征向量。

4. 如何形象化理解 SVD

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

首先放上男神的照片:

我们对该图片进行奇异值分解,则该图片可写成以下和的形式:

上式中,λ1, λ2, … , λk 是按照从大到小的顺序的。

首先,若我们只保留最大的奇异值 λ1,舍去其它奇异值,即 A=λ1p1q1T,然后作图:

结果完全看不清楚,再多加几个奇异值,取前 5 个最大的奇异值,然后作图:

现在貌似有点轮廓了,继续增加奇异值,取前 10 个最大的奇异值,然后作图:

又清晰了一些,继续将奇异值增加到 20 个,然后作图:

现在已经比较清晰了,继续将奇异值增加到 50 个,然后作图:

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

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

(870+1+870)∗50=87050(870+1+870)*50=87050(870+1+870)∗50=87050

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

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

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

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

 

from skimage import io import matplotlib.pyplot as plt from PIL import Image
  • 1
  • 2

 

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”) 

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

参考文献

https://zhuanlan.zhihu.com/p/26306568

https://www.zhihu.com/question/22237507/answer/53804902


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

相关文章

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

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

奇异值分解(SVD)原理

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

SVD(奇异值分解)

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

SVD分解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

用服务器建立个人网站

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

家庭宽带搭建个人服务器

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

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

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

电脑搭建个人服务器

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

搭建个人云服务器

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

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

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

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

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

【VMware】搭建个人服务器

文章目录 准备工作三种网络模式Bridged(桥接模式)定义设置 NAT(网络地址转换模式)定义设置 Host-Only(仅主机模式)定义设置 搭建服务器网络模式的选择在VMWare的网络编辑器中设置转发端口查看宿主机的ip地址使用ssh连接工具进行连接 Mac笔记本跑虚拟机总感觉别扭&#xff0c;通…

阿里云服务器搭建个人网站

文章目录 一、事先准备1、购买阿里云服务器2、购买域名,并进行备案 二、服务器的基本使用1、服务器配置2、远程连接 三、服务器的高级使用1、安装宝塔面板2、部署网站3、固定链接的设置4、为网站部署SSL证书(重点) 一、事先准备 1、购买阿里云服务器 https://www.aliyun.com/…