浅谈SVD的数学原理及应用

在做PCA的实验时,遇到的SVD奇异值分解问题,这里记录自己直观的理解

通常在python中我们都是直接调用numpy模块中的函数,那么返回的U,S,V几个值代表什么意思呢?

1
U, S, V = np.linalg.svd(X)

遇事不明,手册先行:官方手册

手册中简单说明了其含义:

  • U:酉矩阵
  • S:奇异值向量(数学上是奇异值矩阵,但因为这个矩阵类似于对角阵,只有主对角线上的元素非0,程序对其进行了处理,直接提取了对角元素),且元素按降序排列。
  • V:酉矩阵

首先给出SVD分解公式:$W=U \Sigma V^{T}$

如果你看的一脸懵逼,没关系,这只能说明你和我一样,线性代数没怎么学好。所以接下来简单解释一下其背后的数学原理,希望有帮助。

举一个具体分解的例子:

有这么一个矩阵:$W=\left[ \begin{array}{ll}{1} & {1} \\ {0} & {1} \\ {1} & {0}\end{array}\right]$我们要如何把它SVD分解?

step-1.1

计算第一个对角矩阵,$C=W^{T} W=\left[ \begin{array}{lll}{1} & {0} & {1} \\ {1} & {1} & {0}\end{array}\right] \left[ \begin{array}{ll}{1} & {1} \\ {0} & {1} \\ {1} & {0}\end{array}\right]=\left[ \begin{array}{ll}{2} & {1} \\ {1} & {2}\end{array}\right]$,注意得到的是方阵。

step-1.2

接着对这个对角矩阵,求它的特征值$\lambda_{1}=3, \lambda_{2}=1$和特征向量$\vec{v}_{1}=\left[ \begin{array}{l}{\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}}\end{array}\right], \vec{v}_{2}=\left[ \begin{array}{l}{\frac{1}{\sqrt{2}}} \\ {\frac{-1}{\sqrt{2}}}\end{array}\right]$。

step-2.1

计算第二个对角矩阵,$B=W W^{T}=\left[ \begin{array}{ll}{1} & {1} \\ {0} & {1} \\ {1} & {0}\end{array}\right] \left[ \begin{array}{lll}{1} & {0} & {1} \\ {1} & {1} & {0}\end{array}\right]=\left[ \begin{array}{lll}{2} & {1} & {1} \\ {1} & {1} & {0} \\ {1} & {0} & {1}\end{array}\right]$,和step-1.1比起来,能看到区别在于$W^{T}W$和$WW^{T}$。

step-2.2

同样,求它的特征值$\lambda_{1}=3, \lambda_{2}=1, \lambda_{3}=0$和特征向量$\vec{u}_{1}=\left[ \begin{array}{c}{\frac{2}{\sqrt{6} } } \\ {\frac{1}{\sqrt{6} } } \\ {\frac{1}{\sqrt{6} } }\end{array}\right], \vec{u}_{2}=\left[ \begin{array}{c}{0} \\ {\frac{-1}{\sqrt{2} } } \\ {\frac{1}{\sqrt{2} } }\end{array}\right], \vec{u}_{3}=\left[ \begin{array}{c}{\frac{-1}{\sqrt{3} } } \\ {\frac{1}{\sqrt{3} } } \\ {\frac{1}{\sqrt{3} } }\end{array}\right]$。

最终我们根据公式:$W=U \Sigma V^{T}$,就可以得到

$W=\left[ \begin{array}{ll}{1} & {1} \\ {0} & {1} \\ {1} & {0}\end{array}\right]=\left[ \begin{array}{ccc}{\frac{2}{\sqrt{6}}} & {0} & {-\frac{1}{\sqrt{3}}} \\ {\frac{1}{\sqrt{6}}} & {\frac{-1}{\sqrt{2}}} & {\frac{1}{\sqrt{3}}} \\ {\frac{1}{\sqrt{6}}} & {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{3}}}\end{array}\right] \left[ \begin{array}{cc}{\sqrt{3}} & {0} \\ {0} & {1} \\ {0} & {0}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{-1}{\sqrt{2}}}\end{array}\right]$

其中$U$就是$B$的特征向量拼成的酉矩阵,$V^{T}$就是$C$的特征向量拼成的酉矩阵。而$\Sigma$(即S)就是由特征值开根号得到的。

我们还可以把上面的矩阵写成另外的表达方式:

$W=\sqrt{3} \left[ \begin{array}{c}{\frac{2}{\sqrt{6}}} \\ {\frac{1}{\sqrt{6}}} \\ {\frac{1}{\sqrt{6}}}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right]+\left[ \begin{array}{c}{0} \\ {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {\frac{-1}{\sqrt{2}}}\end{array}\right]$

也就是$W=\sqrt\lambda_{1}\vec{u}_{1}\left(\vec{v}_{1}\right)^{T}+\sqrt\lambda_{2}\vec{u}_{2}\left(\vec{v}_{2}\right)^{T}$。再说一次,奇异值的平方=特征值

这样也就可以解释为什么SVD会被用于PCA,实际上我们只是举了很简单的例子,当矩阵的维数更高时,我们最后得到的式子的项数也就越多,但是有些项数的奇异值很小,舍去这些项虽然会丢失局部细节,但是能够在尽量保真的情况下节约存储空间。

参考资料:

[1] 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

[2] 【简化数据】奇异值分解(SVD)

[3] 矩阵分析之奇异值分解(SVD)

-------------End-------------
梦想总是要有的,万一有人有钱呢?