矩阵奇异值的物理意义是什么?

article/2025/1/13 17:43:49

作者:知乎用户链接:https://www.zhihu.com/question/22237507/answer/53804902

来源:https://www.zhihu.com/question/22237507/answer/60991654

矩阵奇异值的物理意义是什么?
或者说,奇异值形象一点的意义是什么?
把m*n矩阵看作从m维空间到n维空间的一个线性映射,
是否:
各奇异向量就是坐标轴,奇异值就是对应坐标的系数?


矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。下面先尽量避开严格的数学符号推导,直观的从一张图片出发,让我们来看看奇异值代表什么意义。


这是女神上野树里(Ueno Juri)的一张照片,像素为高度450*宽度333。暂停舔屏先(痴汉脸)



我们都知道,图片实际上对应着一个矩阵,矩阵的大小就是像素大小,比如这张图对应的矩阵阶数就是450*333,矩阵上每个元素的数值对应着像素值。我们记这个像素矩阵为


现在我们对矩阵进行奇异值分解。直观上,奇异值分解将矩阵分解成若干个秩一矩阵之和,用公式表示就是:




其中等式右边每一项前的系数就是奇异值,分别表示列向量,秩一矩阵的意思是矩阵秩为1。注意到每一项都是秩为1的矩阵。我们假定奇异值满足 (奇异值大于0是个重要的性质,但这里先别在意),如果不满足的话重新排列顺序即可,这无非是编号顺序的问题。


既然奇异值有从大到小排列的顺序,我们自然要问,如果只保留大的奇异值,舍去较小的奇异值,这样(1)式里的等式自然不再成立,那会得到怎样的矩阵——也就是图像?


,这只保留(1)中等式右边第一项,然后作图:




结果就是完全看不清是啥……我们试着多增加几项进来:


,再作图




隐约可以辨别这是短发伽椰子的脸……但还是很模糊,毕竟我们只取了5个奇异值而已。下面我们取20个奇异值试试,也就是(1)式等式右边取前20项构成



虽然还有些马赛克般的模糊,但我们总算能辨别出这是Juri酱的脸。当我们取到(1)式等式右边前50项时:




我们得到和原图差别不大的图像。也就是说当从1不断增大时,不断的逼近让我们回到公式




矩阵表示一个450*333的矩阵,需要保存个元素的值。等式右边分别是450*1和333*1的向量,每一项有元素。如果我们要存储很多高清的图片,而又受限于存储空间的限制,在尽可能保证图像可被识别的精度的前提下,我们可以保留奇异值较大的若干项,舍去奇异值较小的项即可。例如在上面的例子中,如果我们只保留奇异值分解的前50项,则需要存储的元素为,和存储原始矩阵相比,存储量仅为后者的26%。


下面可以回答题主的问题:奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。每个矩阵都可以表示为一系列秩为1的“小矩阵”之和,而奇异值则衡量了这些“小矩阵”对于的权重。

在图像处理领域,奇异值不仅可以应用在数据压缩上,还可以对图像去噪。如果一副图像包含噪声,我们有理由相信那些较小的奇异值就是由于噪声引起的。当我们强行令这些较小的奇异值为0时,就可以去除图片中的噪声。如下是一张25*15的图像(本例来源于[1])





但往往我们只能得到如下带有噪声的图像(和无噪声图像相比,下图的部分白格子中带有灰色):




通过奇异值分解,我们发现矩阵的奇异值从大到小分别为:14.15,4.67,3.00,0.21,……,0.05。除了前3个奇异值较大以外,其余奇异值相比之下都很小。强行令这些小奇异值为0,然后只用前3个奇异值构造新的矩阵,得到




可以明显看出噪声减少了(白格子上灰白相间的图案减少了)。

奇异值分解还广泛的用于主成分分析(Principle Component Analysis,简称PCA)和推荐系统(如Netflex的电影推荐系统)等。在这些应用领域,奇异值也有相应的意义。

考虑题主在问题描述中的叙述:“把m*n矩阵看作从m维空间到n维空间的一个线性映射,是否:各奇异向量就是坐标轴,奇异值就是对应坐标的系数?”我猜测,题主更想知道的是奇异值在数学上的几何含义,而非应用中的物理意义。下面简单介绍一下奇异值的几何含义,主要参考文献是美国数学协会网站上的文章[1]。

下面的讨论需要一点点线性代数的知识。线性代数中最让人印象深刻的一点是,要将矩阵和空间中的线性变换视为同样的事物。比如对角矩阵作用在任何一个向量上





其几何意义为在水平方向上拉伸3倍,方向保持不变的线性变换。换言之对角矩阵起到作用是将水平垂直网格作水平拉伸(或者反射后水平拉伸)的线性变换



如果不是对角矩阵,而是一个对称矩阵



那么,我们也总可以找到一组网格线,使得矩阵作用在该网格上仅仅表现为(反射)拉伸变换,而没有旋转变换



考虑更一般的非对称矩阵


很遗憾,此时我们再也找不到一组网格,使得矩阵作用在该网格上之后只有拉伸变换(找不到背后的数学原因是对一般非对称矩阵无法保证在实数域上可对角化,不明白也不要在意)。我们退求其次,找一组网格,使得矩阵作用在该网格上之后允许有拉伸变换和旋转变换,但要保证变换后的网格依旧互相垂直。这是可以做到的



下面我们就可以自然过渡到奇异值分解的引入。奇异值分解的几何含义为:对于任何的一个矩阵,我们要找到一组两两正交单位向量序列,使得矩阵作用在此向量序列上后得到新的向量序列保持两两正交。下面我们要说明的是,奇异值的几何含义为:这组变换后的新的向量序列的长度。

基础知识:单位向量是模(模就是向量的长度)为1的向量,举例[1,1,1],这个向量的模是根号3,不是1.



当矩阵作用在正交单位向量上之后,得到也是正交的。令
分别是和方向上的单位向量,即,写在一起就是,整理得:



这样就得到矩阵的奇异值分解。奇异值
分别是和的长度。很容易可以把结论推广到一般维情形。


下面给出一个更简洁更直观的奇异值的几何意义(参见[2])。先来一段线性代数的推导,不想看也可以略过,直接看黑体字几何意义部分:

假设矩阵的奇异值分解为




其中是二维平面的向量。根据奇异值分解的性质,
线性无关,线性无关。那么对二维平面上任意的向量,都可以表示为:


作用在上时,




,我们可以得出结论:如果是在单位圆上,那么正好在椭圆上。这表明:矩阵将二维平面中单位圆变换成椭圆,而两个奇异值正好是椭圆的两个半轴长,长轴所在的直线是,短轴所在的直线是

推广到一般情形:一般矩阵将单位球变换为超椭球面
那么矩阵的每个奇异值恰好就是超椭球的每条半轴长度。




参考文献:
[1] We Recommend a Singular Value Decomposition(Feature Column from the AMS)
[2] 徐树方,《矩阵计算的理论与方法》,北京大学出版社。


via:郑宁(知乎)



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

相关文章

游戏用像素画教程知识总结

前言 制作独立游戏美术部分是必不可少的,对于没有美术基础的我理所当然的选择了像素画作为学习目标。下面记录了学习像素画过程中总结的知识点。绘画软件使用的是Aseprite,可以在steam上购买,也可以去网上搜索下载学习版。 形状&#xff08…

html怎么让爱心闪动,css画爱心并实现“爱心跳动”

第一次写博客,来记录自己在前端上的成长,并且希望能够借鉴到其他大神的经验来提高自己的水平。这次打算用css来画一个爱心并实现“爱心跳动”的功能,下面如果有表述不正确的叙述,欢迎各位大神前来指导~ css画爱心并实现“爱心跳动…

如何打印出爱心,以及彩色爱心

原理&#xff1a;&#xff08;1&#xff09;通过循环x,y来建立爱心方框的范围 &#xff08;2&#xff09;以爱心的数学函数&#xff08;x*xy*y-1&#xff09;^3-x^2*y^30作为界限&#xff0c;如果&#xff08;x*xy*y-1&#xff09;^3-x^2*y^3<0则说明像素点在爱心内&#x…

python画爱心(1)

本次我利用turtle画图&#xff0c;展示爱心图形。 来看第一段代码&#xff1a; import turtle turtle.left(40) turtle.forward(160) turtle.circle(80, 190) turtle.right(100) turtle.circle(80, 180) turtle.goto(0,0) turtle.hideturtle() turtle.done() 运行结果&…

【Mathematica】三种画爱心的方法

1. 爱心第一种 ContourPlot3D[{x^2 (9 y^2)/4 z^2 - 1}^3 - x^2 z^3 - (9 y^2 z^3)/80 0, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}, PlotTheme -> "Classic"] 或更改样式 ContourPlot3D[{x^2 9/4*y^2 z^2 - 1}^3 - x^2*z^3 - 9/80*y^2*z^3 0, {x, -2, 2}, {y…

Python画爱心树源码

源码 import turtle import randomdef love(x,y):lvturtle.Turtle()lv.hideturtle()lv.up()lv.goto(x,y)def curvemove():for i in range(20):lv.right(10)lv.forward(2)lv.color(red,pink)lv.speed(10000000)lv.pensize(1)lv.down()lv.begin_fill()lv.left(140)lv.forward(22…

Python画爱心——一颗会跳动的爱心~

给你的Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧&#xff0c;利用Python中的HTML制作一个立体会动的心动小爱心 ​​​​​​ 备注“爱心代码” 领取https://docs.qq.com/doc/DY01kTFBRRXRHVkxr?&u7e29e2e960d345a4863a848d36e98027 成千上百个爱心汇成一个大爱心&am…

python爱心代码特效怎么弄,python画爱心代码大全

大家好&#xff0c;小编为大家解答python画爱心的代码怎么运行的问题。很多人还不知道python爱心代码特效怎么弄&#xff0c;现在让我们一起来看看吧&#xff01; 1、李峋的同款爱心代码是什么 http://81.71.43.115:81。李峋的同款爱心代码是http://81.71.43.115:81&#xff0…

如何把爱心图片变成“伪像素风”?用 CSS 贼容易!

点击上方 前端瓶子君&#xff0c;关注公众号 回复算法&#xff0c;加入前端编程面试算法每日一题群 产品小妹妹对同事阿洋说&#xff1a;“如果你能用CSS把一张爱心图片变成像素风&#xff0c;我今天就答应跟你约会。” 我拍了拍阿洋的肩膀&#xff0c;意味深长地说&#xff1a…

如何用python画一个心形图,用python画爱心怎么运行

大家好&#xff0c;给大家分享一下如何用python画一个心形图&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、画爱心的python代码 我已经很努力了&#xff0c;但是要真的很好看爱心可能拍磨有点困难&#xff08;除了贴图&#xff0c;但…

利用python画爱心表白

*七夕来袭&#xff01;是时候展现专属于程序员的浪漫了&#xff01; 创意代码表白 简单分享一下如何利用python画爱心表白 以程序员的方式撒狗粮&#xff0c;专业浪漫&#xff0c;值得拥有&#xff01; 代码演示 # 导入海龟包 import turtle pen turtle.Turtle() # 定义绘…

画十字架中的爱心

用tkinter画十字架中的爱心 from tkinter import * import math root Tk() w Canvas(root, width800, height800) w.pack() # 画红色的坐标轴线 width800 height800 w0width/2 h0height/2 w.create_line(0, h0, width, h0, fill"red") w.create_line(w0, 0, w0, h…

怎么用计算机画爱心,如何用几何画板画一个爱心

作为强大的几何绘图软件&#xff0c;千万不要以为几何画板只能画一些基本几何图形&#xff0c;其实它的功能强大着呢。其实在使用之后&#xff0c;会发现原来还能用它画出各种函数图像&#xff0c;比如画出类似心形的函数&#xff0c;下面就来一起学习。 具体绘制步骤如下&…

利用Python绘制一个爱心

利用Python绘制一个爱心 效果图&#xff1a; 代码部分&#xff1a; import turtle #导入turtle库 turtle.pensize(4)#设置画笔像素为4像素 turtle.pencolor("red")#设置画笔颜色为红色 turtle.fillcolor("pink")#设置填充颜色为粉红色 turtle.begin_fill…

Python画各种爱心

目录 一行代码画爱心拆解 输出 I ❤ U填充型动态画红心桃心线性立体红心 玫瑰树 一行代码画爱心 print(\n.join([.join([(Love[(x-y)%len(Love)] if ((x*0.05)**2(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<0 else ) for x in range(-30,30)]) for y in range(15,-15,-1)]))…

python画爱心

import turtle import time# 清屏函数 def clear_all():turtle.penup()turtle.goto(0, 0)turtle.color(white)turtle.pensize(800)turtle.pendown()turtle.setheading(0)turtle.fd(300)turtle.bk(600)# 重定位海龟的位置 def go_to(x, y, state):turtle.pendown() if state els…

python画爱心的代码怎么运行_怎么用python实现画爱心

Python中可以使用turtle库来画图&#xff0c;通过控制画笔运动来实现在画布上画图案。 使用Python画爱心代码如下&#xff1a;#!/usr/bin/env python # -*- coding:utf-8 -*- import turtle import time # 画心形圆弧 def hart_arc(): for i in range(200): turtle.rig…

如何用纯 CSS 为母亲节创作一颗像素画风格的爱心

效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/LmrZVX 可交互视频教程 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari,…

如何用纯 CSS 为母亲节创作一颗像素画风格的爱心...

效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/LmrZVX 可交互视频教程 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari, edge …

Python编程 利用Python画一个爱心

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.所使用的库 1.turtle库 2.情人节来历 二.正文 2.背景颜色 3.调整画…