Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小孩都看得懂的 SVD

小孩都看得懂的 SVD

作者头像
用户5753894
发布于 2021-04-21 07:58:02
发布于 2021-04-21 07:58:02
78500
代码可运行
举报
文章被收录于专栏:王的机器王的机器
运行总次数:0
代码可运行

0

结论

奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。

什么是拉 (stretch) 缩 (compress)?什么是旋转 (rotate)?先看原图。

拉缩

下两图沿水平方向拉缩。

下两图沿竖直方向拉缩。

旋转

1

简单的 Puzzle

如下图所示,如何将左边的圆通过旋转和拉缩转换成右边的椭圆?注意拉缩只能沿着水平和竖直的方向进行,不能沿着任何方向进行。

很简单,分三步:

  1. 沿着水平方向拉伸
  2. 沿着竖直方向收缩
  3. 逆时针旋转某个角度

如下动图所示。

2

困难的 Puzzle

如下图所示,如何将左边的圆通过旋转和拉缩转换成右边的椭圆?注意拉缩只能沿着水平和竖直的方向进行,不能沿着任何方向进行。

用上面“水平拉-竖直缩-逆时针旋转”同样的三步,却得不到右边的样子。只是形状对了,但是颜色错了。

这个 Puzzle 解决不了的么?No,在拉伸之前先做一个旋转就可以了,这样整套操作有四步:

  • 顺时针旋转某个角度
  • 沿着水平方向拉伸
  • 沿着竖直方向收缩
  • 顺时针旋转某个角度

如下所示。

由两个 Puzzle 可得出结论:

通过“旋转-拉缩-旋转”三部曲可以完成任何线性转换

3

线性转换

小孩要问了,什么是线性转换 (linear transformation)?线性转换就是矩阵乘以向量。

如上图所示,向量 (p, q) 代表一个点,矩阵 A 乘向量得到 (3p, 4p+5q) 代表另一个点,那么从

(p, q) 到 (3p, 4p+5q) 就是线性转换

下图给 (p, q) 赋予具体“生命”,四个具体的点:

  • (1, 0) 转换到 (3, 4)
  • (0, 1) 转换到 (0, 5)
  • (-1, 0) 转换到 (-3, -4)
  • (0, -1) 转换到 (0, -5)

随着点不断增多,左边的圆就被矩阵 A 线性转换成了右边的椭圆了。

带着问题往下看:矩阵 A 做的线性转换和上面的 Puzzle 能完成同样的事情,难道线性转换做的本质事情也是“旋转-拉缩-旋转”?

在给出答案之前,首先来看两种特殊的矩阵:

  1. 用于旋转的矩阵
  2. 用于拉缩的矩阵

4

用于旋转的矩阵

用于旋转的矩阵在下图里

[ cos(θ) -sin(θ)

sin(θ) cos(θ) ]

用该矩阵乘以向量 (p, q) 得到

(pcos(θ) - qsin(θ), psin(θ) + qcos(θ))

等价于逆时针旋转 θ 角度,如下图所示。

5

用于拉缩的矩阵

用于拉缩的矩阵在下图里

[ σ1 0

0 σ2 ]

用该矩阵乘以向量 (p, q) 得到

(pσ1, qσ2)

等价于水平方向拉伸 σ1 倍,竖直方向拉伸 σ2 倍,如下两图所示。

当 σ 大于 1,是拉伸;当 σ 小于 1,是收缩,当 σ 等于 1,是保持。此外在 SVD 中 σ 大于 0。

6

Puzzle 用数学表示

为了把左边圆转换成右边椭圆

  • 由线性转换可知,需要用矩阵 A 乘以向量 (p, q)
  • 由 Puzzle 可知,需要“旋转-拉伸-旋转”

上两小节也介绍了用于旋转和拉伸的矩阵,那么“旋转-拉伸-旋转” 该动作可以写成三个矩阵相乘,如下图所示。

那么用矩阵 A 和“旋转-拉伸-旋转”三矩阵相乘是等效的,用数学公式写出来如下:

而上面公式就是 SVD。

7

使用 NumPy 做 SVD

对于爱编程的小孩,用 numpy 里的 svd 函数可以瞬间得到“旋转-拉伸-旋转”三矩阵,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy.linalg import svd
A = np.array([[3,0],[4,5]])
svd(A)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(array([[-0.31622777, -0.9486833 ],
        [-0.9486833 , 0.31622777]]),
 array([6.70820393, 2.23606798]),
 array([[-0.70710678, -0.70710678],
        [-0.70710678, 0.70710678]]))
代码语言:javascript
代码运行次数:0
运行
复制

一一分析上面 SVD 的分解后矩阵。


第一个是旋转矩阵,顺时针旋转 45 度。 注意 -π/4 前的负号

第二个是拉缩矩阵

  • 水平拉伸 3√5 倍
  • 竖直拉伸 √5 倍
代码语言:javascript
代码运行次数:0
运行
复制

第三个是旋转矩阵,逆时针旋转 71.72 度。

8

总结

一图胜千言!

用矩阵 A 一步做线性转换

等价于

用三个矩阵先旋转 (VT),再拉缩 (∑),最后旋转 (U),那么

A = U∑VT

小孩们懂 SVD 了么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王的机器 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小孩都看得懂的 SVD 2
奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。用下图来进一步说明:
用户5753894
2021/04/21
5770
小孩都看得懂的 SVD 2
智商140以下慎点
按每行看,左+中=右(去掉重叠线条,保留不重叠线条);按每列看,上+中=下(同理)
小K算法
2021/05/31
7300
小孩都看得懂的主成分分析
本文是「小孩都看得懂」系列的第五篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2019/09/25
8180
小孩都看得懂的主成分分析
扒一扒那些叫欧拉的定理们(十)——群论观点下的欧拉公式进阶
在上一篇中,我们从群论的观点给大家开了个头,介绍了直线上的两个变换群,分别对应正数乘法群和实数加法群,并指出了它们的同构关系,并且正是以指数函数作为映射函数。今天我们继续看,这些内容是怎么帮我们理解欧拉公式的。还是重复一下欧拉公式的内容:
magic2728
2021/08/06
1.3K0
CSS3转换(transform)基本用法介绍
一个炫酷的网页离不开css的transform、transition、animation三个属性,之前一直没有涉及到这块内容,刚好最近要做一个相关东西,趁此机会好好学一学这三个属性。
用户10106350
2022/10/28
1.8K0
CSS3转换(transform)基本用法介绍
后处理——深入相机变形特效
后处理(Post-processing),是针对原有的游戏画面进行算法加工,达到提升画面质量或增强画面效果的技术,可通过着色器Shader程序实现。
Y.one
2021/05/31
1.7K0
后处理——深入相机变形特效
css3动画变换transform用法
刚才说到transition动画执行,接下来看下动画变换(transform),transform属性的取值4个
十月梦想
2018/08/29
4800
【陆勤践行】奇异值分解 - 最清晰易懂的svd 科普
在这篇文章中,我们以几何的视角去观察矩阵奇异值分解的过程,并且列举一些奇异值分解的应用。 介绍 矩阵奇异值分解是本科数学课程中的必学部分,但往往被大家忽略。这个分解除了很直观,更重要的是非常具有实用价值。譬如,Netflix(在线电影租赁公司)对能够提高其电影推荐系统准确率10%的人提供100万美元的丰厚奖金。令人惊奇的是,这个看似简单的问题却非常具有挑战性,相关的团队正在使用非常复杂的技术解决之,而这些技术的本质都是奇异值分解。 奇异值分解简单来讲,就是以一种方便快捷的方式将我们感兴趣的矩阵分解成更简单且
陆勤_数据人网
2018/02/26
1.3K0
【陆勤践行】奇异值分解 - 最清晰易懂的svd 科普
(转载非原创)CSS3转换(transform)基本用法介绍
只是觉得写的很好分享到腾讯云,推荐腾讯云服务器,除学生机外非常便宜的活动 腾讯云活动
xlj
2021/07/06
5850
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29523119/article/details/78577246
用户1148525
2019/06/11
1.6K0
深度学习笔记之奇异值分解及几何意义
SVD实际上是数学专业内容,但它现在已经渗入到不同的领域中。SVD的过程不是很好理解,因为它不够直观,但它对矩阵分解的效果却非常好。比如,Netflix(一个提供在线电影租赁的公司)曾经就悬赏100万美金,如果谁能提高它的电影推荐系统评分预测准确率提高10%的话。令人惊讶的是,这个目标充满了挑战,来自世界各地的团队运用了各种不同的技术。最终的获胜队伍"BellKor's Pragmatic Chaos"采用的核心算法就是基于SVD。
Jetpropelledsnake21
2020/08/02
1.7K0
基础 | 在物理引擎中画圆弧
作者|zzbozheng 原文|http://imweb.io/topic/5959aee62536e43f14da1a68 因为需求的需要,要使用在物理引擎中使用四分之一圆弧,我们来看看怎么实现在物理引擎中画出四分之一的圆弧, 在物理引擎中绘制圆弧 一般来说,物理引擎都是提供一般的画图方法,比如:circle(圆)、polygon(不规则多边形)、rectangle(矩形) 等图形,但如果需要画出比较灵活又不规则的图形的话,那么就需要使用 svg 提供支持了。下面来探讨一下如何实现四分之一圆弧: 我们来看
用户1097444
2022/06/29
1.7K0
基础 | 在物理引擎中画圆弧
奇异值分解及几何意义「建议收藏」
PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义。能在有限的篇幅把这个问题讲解的如此清晰,实属不易。原文举了一个简单的图像处理问题,简单形象,真心希望路过的各路朋友能从不同的角度阐述下自己对SVD实际意义的理解,比如 个性化推荐中应用了SVD,文本以及Web挖掘的时候也经常会用到SVD。
全栈程序员站长
2022/11/17
8560
奇异值分解及几何意义「建议收藏」
Unity 水、流体、波纹基础系列(二)——方向流体(Directional Flow)
这是流体材质的第二篇,继上一篇纹理变形之后,讲述如何对齐流体而不再是将它们进行扭曲。
放牛的星星
2020/08/28
5.1K0
在物理引擎中画圆弧
本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 因为需求的需要,要使用在物理引擎中使用四分之一圆弧,我们来看看怎么实现在物理引擎中画出四分之一的圆弧,
IMWeb前端团队
2018/01/08
2.7K0
在物理引擎中画圆弧
变换(Transform)(1)-向量、矩阵、坐标系与基本变换
如果要将右侧坐标系变为左侧那种,我们只需要做一些旋转操作,将右侧坐标系顺时针旋转180度,再将整个坐标系水平翻转即可。我们可以通过一定的旋转操作将两个坐标系重合,那么我们就称它们具有相同的旋向性(handedness)。
Zero Two
2024/07/21
8360
小孩都看得懂的 HMM
本文是「小孩都看得懂」系列的第十九篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2021/11/19
7810
CSS3变形属性
CSS3变形 CSS2.1中的页面都是静态的,网页设计师也习惯把它作为页面效果的设计工具。多年来,Web设计师依赖于图片、Flash或 JavaScript才能完成修改页面的外观。 CSS3将改变设计师这种思维,借助CSS3可以轻松倾斜、缩放、移动以及翻转元素。 2012年9月,W3C组织发布了CSS3变形工作草案。允许CSS把元素转变为2D或3D空间,这个草案包括了CSS32D变形和CSS33D变形。CSS3变形是一些效果的集合, 比如平移、旋转、缩放和倾斜效果,每个效果都称为变形函数( Transform Function),它们可以操控元素发生旋转、缩放、平移等变化。 这些效果在之前都需要依赖图片、Flash或JavaScript才能完成。而使用纯CSS来完成这些变形无须加载这些额外的文件,再一次提升了开发效率, 提高了页面的执行效率。 CSS3变形属性及函数: CSS3变形允许动态的控制元素,可以在屏幕周围移动它们,缩小或扩大、旋转,或结合所有这些产生复杂的动画效果。通过CSS变形,可以让元素生成静态视觉效果,也可以很容易结合CSS3的transition和动画的keyframe产生 一些动画效果:http:/ /www.iis7.com/b/wzjk/ CSS3变形中具有 X/ Y可用的函数: translateX()、translateY()、scaleX()、scaleY()、skewX()和skewY()。 1,CSS3 2D变形函数包括: translate()、scale()、rotate()和skew()。translate()函数接受CSS的标准度量单位; scale()函数接受 一个0~1 之间的十进制值; rotate() 和 skew() 两个函数都接受 一个径向的度量单位值deg。除了rotate()函数之外,每个函数都接受X轴和Y轴的参数。 2D变形中还有一个矩阵matrix()函数, 包括6个参数。 2,CSS3 3D变形函数包括: rotateX()、rotateY()、rotate3d()、translateZ()、translate3d()、scaleZ()和scale3d()。 3D变形中也包括一个矩阵matrix3d()函数, 包括16 个参数。 CSS 变形属性详解: transform属性指一组转换函数, transform-origin属性指定元素的中心点在哪, 新增加了第三个数transform-origin-z, 控制元素三维空间中心点。 transform-style的值设置为preserve- 3d, 建立 一个3D渲染环境。 :CSS3 2D变形 在二维或三维空间,元素可以被扭曲、移位或旋转。只不过2D变形工作在X轴和Y轴,也就是大家常说的水平轴和垂直轴;而3D变形工作在X轴和Y轴之外, 还有一个Z轴,这些3D变换不仅可以定义元素的长度和宽度,还有深度。首先讨论元素在2D平面如何变换,然后在进入3D变换的讨论。CSS32D变换让Web设计师有了更多的自由来装饰和变形HTML组件,同时有更多的功能装饰文本和更多的动画选项来装饰div元素。2D位移在这里translate是一种方法,将元素向指定的方向移动, 类似于position中的relative。可以简单理解为,使用translate()函数可以把元素从原来的位置移动,而不影响在 X、 Y 轴上任何组件。 translate() 函数可以取一个值tx,也可以取两个值tx和 ty, ·tx:代表X轴( 横坐标)移动的向量长度, 当其值为正值时, 元素向X轴右方向移动, 反之其值为负值时, 元素向X轴左方向移动。 ·ty:代表Y轴( 纵坐标) 移动的向量长度,当其值为正值时, 元素向Y轴下方向移动, 反之其值为负值时, 元素向Y轴上方向移动。 如果ty没有显式设置时, 相当于ty=0。 结合起来, translate()函数移动元素主要有以下三种移动。 -水平移动: 向右移动 translate( tx, 0) 和向左移动 translate(- tx, 0)。 -垂直移动:向上移动 translate( 0,- ty) 和向下移动 translate( 0, ty)。 -对角移动:右下角移动 translate( tx, ty)、右上角移动translate( tx,- ty)、 左上角移动translate(- tx,- ty) 和左下角移动translate(- tx, ty)。 如果要将对象沿着一个方向移动, 如沿着水平轴或者纵轴移动, 可以使用translate( tx, 0) 和translate( 0, ty)来实现。 其实在变形中还为单独一个方向移动对象提供了更简单的方法。 ·translateX():水平方向移动一个对象。通过给定一个X轴方向的数值指定对象沿水平轴方向的位移。简单点
py3study
2020/01/08
2.4K0
小孩都看得懂的 GAN
本文是「小孩都看得懂」系列的第十八篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2021/11/19
5810
3D图形学线代基础
如标题所言都是些很基础但是异常重要的数学知识,如果不能彻底掌握它们,在 3D 的世界中你将寸步难行。
NewbieYoung
2020/10/26
2.3K0
3D图形学线代基础
相关推荐
小孩都看得懂的 SVD 2
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档