0
结论
奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。
什么是拉 (stretch) 缩 (compress)?什么是旋转 (rotate)?先看原图。
拉缩
下两图沿水平方向拉缩。
下两图沿竖直方向拉缩。
旋转
1
简单的 Puzzle
如下图所示,如何将左边的圆只通过旋转和拉缩转换成右边的椭圆?注意拉缩只能沿着水平和竖直的方向进行,不能沿着任何方向进行。
很简单,分三步:
如下动图所示。
2
困难的 Puzzle
如下图所示,如何将左边的圆只通过旋转和拉缩转换成右边的椭圆?注意拉缩只能沿着水平和竖直的方向进行,不能沿着任何方向进行。
用上面“水平拉-竖直缩-逆时针旋转”同样的三步,却得不到右边的样子。只是形状对了,但是颜色错了。
这个 Puzzle 解决不了的么?No,在拉伸之前先做一个旋转就可以了,这样整套操作有四步:
如下所示。
由两个 Puzzle 可得出结论:
通过“旋转-拉缩-旋转”三部曲可以完成任何线性转换。
3
线性转换
小孩要问了,什么是线性转换 (linear transformation)?线性转换就是矩阵乘以向量。
如上图所示,向量 (p, q) 代表一个点,矩阵 A 乘向量得到 (3p, 4p+5q) 代表另一个点,那么从
(p, q) 到 (3p, 4p+5q) 就是线性转换
下图给 (p, q) 赋予具体“生命”,四个具体的点:
随着点不断增多,左边的圆就被矩阵 A 线性转换成了右边的椭圆了。
带着问题往下看:矩阵 A 做的线性转换和上面的 Puzzle 能完成同样的事情,难道线性转换做的本质事情也是“旋转-拉缩-旋转”?
在给出答案之前,首先来看两种特殊的矩阵:
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 和“旋转-拉伸-旋转”三矩阵相乘是等效的,用数学公式写出来如下:
而上面公式就是 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 前的负号
第二个是拉缩矩阵
第三个是旋转矩阵,逆时针旋转 71.72 度。
8
总结
一图胜千言!
用矩阵 A 一步做线性转换
等价于
用三个矩阵先旋转 (VT),再拉缩 (∑),最后旋转 (U),那么
A = U∑VT
小孩们懂 SVD 了么?