专栏首页王的机器小孩都看得懂的 SVD

小孩都看得懂的 SVD

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 函数可以瞬间得到“旋转-拉伸-旋转”三矩阵,代码如下:

from numpy.linalg import svd
A = np.array([[3,0],[4,5]])
svd(A)
(array([[-0.31622777, -0.9486833 ],
        [-0.9486833 , 0.31622777]]),
 array([6.70820393, 2.23606798]),
 array([[-0.70710678, -0.70710678],
        [-0.70710678, 0.70710678]]))

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


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

第二个是拉缩矩阵

  • 水平拉伸 3√5 倍
  • 竖直拉伸 √5 倍

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

8

总结

一图胜千言!

用矩阵 A 一步做线性转换

等价于

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

A = U∑VT

小孩们懂 SVD 了么?

本文分享自微信公众号 - 王的机器(MeanMachine1031),作者:王圣元

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小孩都看得懂的 SVD 2

    奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。用下图来进一步说明:

    用户5753894
  • 小孩都看得懂的 GMM

    聚类 (clustering) 是无监督学习中的一种任务类型,将没有标准的数据“聚”在一起,“赋予”它们标签,其过程如下面两图所示。

    用户5753894
  • 小孩都看得懂的 p-value

    本文是「小孩都看得懂」系列的第九篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • 小孩都看得懂的聚类

    本文是「小孩都看得懂」系列的第四篇,本系列的特点是没有公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • 小孩都看得懂的假设检验

    本文是「小孩都看得懂」系列的第十篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • 小孩都看得懂的推荐系统

    我还是推荐系统小白,因此对此课题理解相当浅显,但一定很好懂。这才是学一样新东西的正确开始方式。

    用户5753894
  • 小孩都看得懂的主成分分析

    本文是「小孩都看得懂」系列的第五篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • 小孩都看得懂的循环神经网络

    神经网络其实就是一堆参数,我们用矩阵来表示这些参数好不好?具体公式见下图,大家来用矩阵乘以向量来验证一下上面两组联系。

    用户5753894
  • 小孩都看得懂的熵、交叉熵和 KL 散度

    本文是「小孩都看得懂」系列的第八篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • 小孩都看得懂的多臂老虎机和汤姆森采样

    多臂老虎机 (multi-armed bandit, MAB) 是赌场里的一种游戏。首先展示单臂老虎机。

    用户5753894
  • 新手小白都能看得懂的HTTPS加密算法!看完即懂!

    说出来你可能不信,密钥这两个字的规范读音竟然是【mì yuè】,听起来像蜜月,哈哈。不过,在密码学的语境下,读作【 mì yào】的应该更多吧。扯远了,这集我们...

    张晓衡
  • 机器学习集成算法:XGBoost思想

    《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来...

    double
  • 新手都能看得懂的 ES6 Iterators

    本文旨在分析理解 Iterators。 Iterators 是 JS中的新方法,可以用来循环任意集合。 在ES6中登场的Iterators。因其可被广泛使用,并...

    前端小智@大迁世界
  • 机器学习集成算法:XGBoost思想

    《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来...

    企鹅号小编
  • 108个程序员的笑话,你都看得懂吗?

    1、程序猿最烦两件事,第一件事是别人要他给自己的代码写文档,第二件呢?是别人的程序没有留下文档。 2、程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高...

    智能算法
  • 插画版Kubernetes指南(小孩子也能看懂的kubernetes教程)

    编者按:Matt Butcher 是 Deis 的平台架构师,热爱哲学,咖啡和精雕细琢的代码。有一天女儿走进书房问他什么是 Kubernetes,于是就有了这本...

    kubernetes中文社区
  • 「漫画版」 小朋友都能看懂得 DevOops!不允许你有问号!

    DevOps消除了障碍,并减轻了开发人员和运营人员之间的紧张关系。革命性的DevOops!

    小小科
  • 小白都能看得懂的服务调用链路追踪设计与实现

    系统服务调用链路是指从用户或是机器发起服务请求到结束,按顺序记录整个请求链路的相关数据,以备后续查询分析、定位系统 bug 或性能优化所用。

    IT技术小咖
  • 奇异值分解(SVD)

    最近两天都在看奇异值分解及其在推荐系统和图像压缩方面的应用,这部分知识比较散也比较难理解,看代码不是很好懂,所以通过编学边整理的方式帮助大脑理解这部分知识。 ...

    用户1332428

扫码关注云+社区

领取腾讯云代金券