奇异值分解(SVD)

奇异值分解(SVD)

上次写了关于PCA的数学原理,这次来聊一聊SVD。最早接触到SVD是在矩阵论中,当时也没有想太多,只记住了一个公式。后来学习机器学习以后才知道SVD也可以用来做降维。

先给出SVD的公式M=U\Sigma V^T,其中UV为酉矩阵,\Sigma 是非零项为奇异值的对角矩阵。SVD本质上就是把一个矩阵M分解成三个矩阵相乘的形式。

可以把SVD看作是一个优化问题:在|\vec{x}|=1的单位圆上如何去优化函数f(\vec{x})=|M\vec{x}|。这个优化问题可以利用拉格朗日乘数法求出,得到极值点\vec{x}是对称矩阵M^TM的特征向量(对称矩阵的特征向量相互正交)。

假设我们得到两个极值点\vec{v_i}\vec{v_j},那么极值\sigma_i=|M\vec{v_i}|以及\sigma_j=|M\vec{v_j}|被称为奇异值,设\vec{u_i}\vec{u_j}M\vec{v_i}M\vec{v_j}方向上的单位向量,那么

\sigma_i\vec{u_i}=M\vec{v_i}\\
\sigma_j\vec{u_j}=M\vec{v_j}

M\vec{v_i}\cdot M\vec{v_j}=\vec{v_i}^TM^TM\vec{v_j}=\vec{v_i}\lambda\vec{v_j}=0,因此\vec{u_i}\cdot\vec{u_j}=0,所以\vec{u_i}\vec{u_j}互相正交。

对于向量\vec{x}可以分解为

\vec{x}=(\vec{v_i}\cdot\vec{x})\vec{v_i}+(\vec{v_j}\cdot\vec{x})\vec{v_j}

也就意味着

\begin{align}
&M\vec{x}=(\vec{v_i}\cdot\vec{x})M\vec{v_i}+(\vec{v_j}\cdot\vec{x})M\vec{v_j}\\
&M\vec{x}=(\vec{v_i}\cdot\vec{x})\sigma_i\vec{u_i}+(\vec{v_j}\cdot\vec{x})\sigma_j\vec{u_j}\\
&M\vec{x}=\vec{u_i}\sigma_i\vec{v_i}^T\vec{x}+\vec{u_j}\sigma_j\vec{v_j}^T\vec{x}
\end{align}

因此M=U\Sigma V^T

SVD与PCA

在PCA中,我们优化的目标是协方差矩阵M^TM,对于SVD分解

\begin{align}
&M^TM=V\Sigma^2V^T\\
&\Sigma^2 = V^TM^TMV
\end{align}

对比下式,我们可以看到与PCA相类似的形式,那么就可以得到降维后的矩阵Y=MV=U\Sigma V^TV=U\Sigma。这样的话,我们只要选取对角矩阵\Sigma中的前几个比较大的奇异值,就可以做主成分降维。

相比于PCA,SVD用的更多,原因在于

  • SVD不需要求解协方差矩阵(计算协方差矩阵的时候会有一些误差)
  • SVD可以方便地求出另一个方向上的主成分

参考

We Recommend a Singular Value Decomposition
发布于 2017-06-02

文章被以下专栏收录