前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小孩都看得懂的 SVD

小孩都看得懂的 SVD

作者头像
用户5753894
发布2021-04-21 15:58:02
6730
发布2021-04-21 15:58:02
举报
文章被收录于专栏:王的机器

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
复制
from numpy.linalg import svd
A = np.array([[3,0],[4,5]])
svd(A)
代码语言:javascript
复制
(array([[-0.31622777, -0.9486833 ],
        [-0.9486833 , 0.31622777]]),
 array([6.70820393, 2.23606798]),
 array([[-0.70710678, -0.70710678],
        [-0.70710678, 0.70710678]]))
代码语言:javascript
复制

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


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

第二个是拉缩矩阵

  • 水平拉伸 3√5 倍
  • 竖直拉伸 √5 倍
代码语言:javascript
复制

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

8

总结

一图胜千言!

用矩阵 A 一步做线性转换

等价于

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

A = U∑VT

小孩们懂 SVD 了么?

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档