数据预处理-特征降维

 奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总结,并讨论在在PCA降维算法中是如何运用运用SVD的。

回顾特征值和特征向量

我们首先回顾下特征值和特征向量的定义如下:$$Ax=λx$$
其中A是一个$n×n$的实对称矩阵,$x$是一个$n$维向量,则我们说$λ$是矩阵$A$的一个特征值,而 $x$ 是矩阵 $A$ 的特征值$λ$所对应的特征向量。
求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵A特征分解。如果我们求出了矩阵A的n
个特征值$λ1≤λ2≤…≤λn$,以及这n个特征值所对应的特征向量${w1,w2,…wn}$,,如果这n个特征向量线性无关,那么矩阵A就可以用下式的特征分解表示:$$A=WΣW−1$$

其中$W$是这$n$个特征向量所张成的$n×n$维矩阵,而$Σ$为这$n$个特征值为主对角线的$n×n$维矩阵。
一般我们会把 $W$ 的这 $n$ 个特征向量标准化,即满足$||w_i||_2=1$, 或者说$w^T_iw_i=1$,此时$W$的$n$个特征向量为标准正交基,满足$W^TW=I$,即$W^T=W^{−1}$, 也就是说W为酉矩阵。
这样我们的特征分解表达式可以写成$A=WΣW^T$

注意到要进行特征分解,矩阵$A$必须为方阵。那么如果$A$不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,此时我们的SVD登场了。

SVD的定义

SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个$m×n$的矩阵,那么我们定义矩阵$A$的SVD为:$$A=UΣV^T$$

  • $U$是一个$m×m$ 的矩阵,
  • $Σ$是一个$m×n$的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,
  • $V$是一个$n×n$的矩阵。$U$和$V$都是酉矩阵,即满足$U^TU=I$,$V^TV=I$。

SVD的几何意义是:任何线性变换都可以分解为三个基本变换的组合:

  • 旋转(U):在输出空间中旋转坐标系
  • 缩放(Σ):沿坐标轴进行不同比例的缩放
  • 旋转(Vᵀ):在输入空间中旋转坐标系

下图可以很形象的看出上面SVD的定义:
IMAGE

那么我们如何求出SVD分解后的$U,Σ,V$ 这三个矩阵呢?

  • 如果我们将A的转置和A做矩阵乘法,那么会得到$n×n$的一个方阵$A^TA$。既然$A^TA$是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:$$(A^TA)v_i=λ_iv_i$$这样我们就可以得到矩阵$A^TA$ 的$n$个特征值和对应的$n$个特征向量$v$了。将$A^TA$的所有特征向量张成一个$n×n$ 的矩阵$V$,就是我们SVD公式里面的$V$矩阵了。一般我们将$V$中的每个特征向量叫做$A$的右奇异向量
  • 如果我们将$A$和$A$的转置做矩阵乘法,那么会得到$m×m$的一个方阵$AA^T$。既然$AA^T$是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:$$(AA^T)u_i=λ_iu_i$$这样我们就可以得到矩阵$AA^T$的$m$个特征值和对应的$m$个特征向量$u$了。将$AA^T$的所有特征向量张成一个$m×m$ 的矩阵$U$,就是我们SVD公式里面的$U$矩阵了。一般我们将$U$中的每个特征向量叫做$A$的左奇异向量

$U$和$V$我们都求出来了,现在就剩下奇异值矩阵$Σ$ 没有求出了。由于$Σ$除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值$σ$就可以了。
我们注意到:$A=UΣV^T⇒AV=UΣV^TV⇒AV=UΣ⇒Av_i=σ_iu_i⇒σ_i=Av_i/u_i$

这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵$Σ$。
上面还有一个问题没有讲,就是我们说$A^TA$ 的特征向量组成的就是我们SVD中的$V$矩阵,而$AA^T$的特征向量组成的就是我们SVD中的$U$矩阵,这有什么根据吗?这个其实很容易证明,我们以$V$矩阵的证明为例。$$A=UΣV^T⇒A^T=VΣ^TU^T⇒A^TA=VΣ^TU^TUΣV^T=VΣ^2V^T$$

上式证明使用了:$U^TU=I,Σ^TΣ=Σ^2$。可以看出ATA的特征向量组成的的确就是我们SVD中的$V$矩阵。类似的方法可以得到$AA^T$ 的特征向量组成的就是我们SVD中的$U$矩阵。

进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:$σ_i=\sqrt{λ_i}$

这样也就是说,我们可以不用$σ_i=Av_i/u_i$ 来计算奇异值,也可以通过求出$A^TA$的特征值取平方根来求奇异值。

奇异值计算

假设我们要处理的矩阵是:
$$
A = \left(
\begin{matrix}
0 & 1 \
1 & 1 \
1 & 0
\end{matrix}
\right) \tag{1}
$$

  • 我们首先求出$A^TA$和$AA^T$

$$
A^TA=\left(
\begin{matrix}
0 & 1 & 1\
1 & 1 & 0\
\end{matrix}
\right) \left(
\begin{matrix}
0 & 1 \
1 & 1 \
1 & 0
\end{matrix}
\right) =
\left(
\begin{matrix}
2 & 1\
1 & 2\
\end{matrix}
\right)
$$
$$
AA^T=\left(
\begin{matrix}
0 & 1 \
1 & 1 \
1 & 0
\end{matrix}
\right)
\left(
\begin{matrix}
0 & 1 & 1\
1 & 1 & 0\
\end{matrix}
\right) =
\left(
\begin{matrix}
1 & 1 & 0\
1 & 2 & 1 \
0 & 1 & 1
\end{matrix}
\right)
$$

  • 进而求出方阵 $A^TA$的特征值和特征向量

$$
AA^T - \lambda I =\left(
\begin{matrix}
2 & 1\
1 & 2\
\end{matrix}
\right) - \lambda \left(
\begin{matrix}
1 & 0\
0 & 1\
\end{matrix}
\right) = \left(
\begin{matrix}
2-\lambda & 1\
1 & 2-\lambda\
\end{matrix}
\right) = 0
$$

$$
a_{11}a_{22} -a_{12}a_{21}=0
->
(2-\lambda)(2-\lambda) -11= 4-4\lambda+\lambda^2-1=\lambda^2-4\lambda+3 =0
$$
$$
λ_1=3;u_1=\left(
\begin{matrix}
1/\sqrt{2} \
1/\sqrt{2}
\end{matrix}
\right)
;
λ_2=1;u_2=\left(
\begin{matrix}
-1/\sqrt{2} \
1/\sqrt{2}
\end{matrix}
\right)
$$

  • 接着求方阵 $AA^T$的特征值和特征向量
    $$
    λ_1=3;u_1=\left(
    \begin{matrix}
    1/\sqrt{6} \
    2/\sqrt{6} \
    1/\sqrt{6}
    \end{matrix}
    \right)
    ;
    λ_2=1;u_2=\left(
    \begin{matrix}
    1/\sqrt{2} \
    0 \
    −1/\sqrt{2}
    \end{matrix}
    \right)
    ;
    λ_3=0;u_3=\left(
    \begin{matrix}
    1/\sqrt{3} \
    −1/\sqrt{3} \
    1/\sqrt{3}
    \end{matrix}
    \right)
    $$
  • 利用Avi=σiui,i=1,2求奇异值:
    $$
    \left(
    \begin{matrix}
    0 & 1 \
    1 & 1 \
    1 & 0
    \end{matrix}
    \right)
    \left(
    \begin{matrix}
    1/\sqrt{2} \
    1/\sqrt{2}
    \end{matrix}
    \right)=\sigma_1
    \left(
    \begin{matrix}
    1/\sqrt{6} \
    2/\sqrt{6} \
    1/\sqrt{6}
    \end{matrix}
    \right) =>
    \sigma_1=\sqrt{3}
    $$
    $$
    \left(
    \begin{matrix}
    0 & 1 \
    1 & 1 \
    1 & 0
    \end{matrix}
    \right)
    \left(
    \begin{matrix}
    -1/\sqrt{2} \
    1/\sqrt{2}
    \end{matrix}
    \right)=\sigma_2
    \left(
    \begin{matrix}
    1/\sqrt{2} \
    0 \
    −1/\sqrt{2}
    \end{matrix}
    \right) =>
    \sigma_2=1
    $$

最终得到A的奇异值分解为:
$$
A=UΣV^T =
\left(
\begin{matrix}
1/\sqrt{6} & 1/\sqrt{2} & 1/\sqrt{3}\
2/\sqrt{6} & 0 & −1/\sqrt{3}\
1/\sqrt{6} & −1/\sqrt{2} & 1/\sqrt{3}
\end{matrix}
\right)
\left(
\begin{matrix}
1/\sqrt{3} & 0\
0 & 1 \
0 & 0
\end{matrix}
\right)
\left(
\begin{matrix}
1/\sqrt{2} & 1/\sqrt{2}\
-1/\sqrt{2} & 1/\sqrt{2}
\end{matrix}
\right)
$$

SVD的性质

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:
$$A_{m×n}=U_{m×m}Σ{m×n}V^T{n×n}≈U_{m×k}Σ{k×k}V^T{k×n}$$

其中$k$要比$n$小很多,也就是一个大的矩阵$A$可以用三个小的矩阵$U_{m×k},Σ{k×k},V^T{k×n}$ 来表示。如下图所示,现在我们的矩阵A只需要灰色的部分的三个小矩阵就可以近似描述了。
image
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。下面我们就对SVD用于PCA降维做一个介绍。

reference

[1]. https://www.cnblogs.com/pinard/p/6251584.html
[2]. 奇异值计算

-------------本文结束感谢您的阅读-------------