SVD奇异值分解
SVD 使用 correlations 方法计算
首先在说SVD之前回忆一波特征值分解:
特征值分解
特征值分解简单来说就是把矩阵$\mathbf{A}$分解成特征向量矩阵$\times$特征值形成的对角矩阵$\times$特征向量矩阵的逆的形式,即
$$
\begin{equation}
\mathbf{A = V \Lambda V^{-1}}
\end{equation}
$$
其中 $\mathbf{V}$ 是 $\mathbf{A}$ 的特征向量上式还可以写成这样,即原矩阵 $\times$ 特征向量矩阵 = 特征向量矩阵 $\times$ 特征值矩阵,特征值分解只能应用于方阵
$$
\begin{equation}\label{2}
\mathbf{A V = V\Lambda }
\end{equation}
$$
SVD分解
关于一个向量$\mathbf{X}$ ,首先将其看成是列向量的矩阵,且假设$\mathbf{X}\in\mathbb{R}^{n \times m},(n>> m)$
$$
\begin{equation}
\mathbf{X}=\left[\begin{array}{llll}
\mid & \mid & & \mid\\
x_1 & x_{2} & \cdots & x_{m} \\
\mid & \mid & & \mid
\end{array}\right]
\end{equation}
$$
则$\mathbf{XX^{\top}}$ 是一个$m\times m$的矩阵

$$
\begin{equation}
\end{equation}
$$
而这个矩阵就是矩阵中$x_1,x_2\cdots x_m$ 相互之间的相关性。
$$
\begin{equation}
\mathbf{XX^{\top}}=\left[\begin{array}{cccc}
x_{1}^{\top} x_{1} & x_{1}^{\top} x_{2} & \cdots & x_{1}^{\top} x_{m} \\
x_{2}^{\top} x_{1} & x_{2}^{\top} x_{2} & \cdots & x_{2}^{\top} x_{m} \\
\vdots & \vdots & \ddots & \vdots \\
x_{m}^{\top} x_{1} & x_{m}^{\top} x_{2} & - & x_{m}^{\top} x_{m}
\end{array}\right]
\end{equation}
$$
解释完$\mathbf{XX^{\top}}$的含义就可以看SVD分解了
首先SVD的分解形式为:
$$
\begin{equation}
\mathbf{X = U{\Sigma} V^{\top}}
\end{equation}
$$
其中 $\mathbf{U}$ 称之为$\mathbf{X}$的左奇异向量矩阵,$\mathbf{V}$称之为 $\mathbf{X}$的奇异向量矩阵,$\mathbf{U}$ 和 $\mathbf{V}$ 都是共轭转置矩阵,即其本身乘以其共轭转置得到单位矩阵。
$$
\begin{equation}
\mathbf{U U^\star = I,\\
V V^\star = I} \\
\end{equation}
$$
$\mathbf{(U ^\star =U^\top、V^{\star} = V^\top)}$ 如果 $\mathbf{U,V}$ 不是复数矩阵。
$\mathbf{\Sigma}$ 称之为 $\mathbf{X}$的奇异值矩阵,其中$\mathbf{\Sigma}$ 是对角矩阵,且每个奇异值的重要性按行顺序排列。
SVD分解可以是非方阵,也就是说任何矩阵都有其奇异值矩阵、左/右奇异向量矩阵,这和特征值分解是不同的。
SVD分解和特征值分解的关系
对$\mathbf{X}$和$\mathbf{X^{\top}}$进行简化SVD分解可以分别得到
注:所谓简化SVD分解是matlab的一个函数
svd(X,'economy'),其得到的是近似最优,以 $\mathbf{U}$ 的维度确定 $ \Sigma$ 的维度,下面将矩阵加帽以表示
$$
\begin{equation}
\begin{array}{l}
\mathbf{\bar{X}=\hat{U} \hat{\Sigma} V^{\top}}\\
\mathbf{\bar{X}^{\top}=V \hat{\Sigma} \hat{U}^{\top}}
\end{array}
\end{equation}
$$
则$\mathbf{X^{\top}X}$ 可以写成:
$$
\begin{equation}\label{a}
\mathbf{X^{\top}X}=\mathbf{V \hat{\Sigma} \hat{U}^{\top}\hat{U} \hat{\Sigma} V^{\top}
=\hat{V} \hat{\Sigma}^{2}\hat{V}^{\top}}\\
\Longrightarrow\qquad \mathbf{X^{\top}X\hat{V}}=\mathbf{ \hat{V}\hat{\Sigma}^{2}}
\end{equation}
$$
则$\mathbf{XX^{\top}}$ 可以写成:
$$
\begin{equation}\label{b}
\mathbf{XX^{\top}}=\mathbf{\hat{U} \hat{\Sigma} V^{\top}V \hat{\Sigma} \hat{U}^{\top}
=\hat{U} \hat{\Sigma}^{2}\hat{U}^{\top}}\\
\Longrightarrow\qquad \mathbf{XX^{\top}\hat{U}}=\mathbf{\hat{U} \hat{\Sigma}^{2}}
\end{equation}
$$
上面两个式子,结合公式 $\eqref{2}$ 可以推理得到的是 $\mathbf{\hat{V}}$ 和 $\mathbf{\hat{U}}$ 都是上述对应矩阵 $\mathbf{X^{\top}X}$ 和 $\mathbf{XX^{\top}}$ 的特征向量矩阵,而 $\mathbf{\Sigma^2}$是特征值。也就是说,一个矩阵和其自身转置相乘得到其协方差阵,然后进行协方差特征值分解,$\mathbf{X^{\top}X}$ 得到的是 $\mathbf{X}$的右特征值 $\mathbf{V}$,$\mathbf{XX^{\top}}$得到的是左特征值 $\mathbf{U}$,这样便实现了使用特征值分解得到奇异分解的结果了。
但是需要注意的是在公式 $\eqref{b}$ 中得出来的的矩阵$\mathbf{XX^{\top}}$ 一般来说都非常巨大,是$n \times n$维矩阵,所以应该尽量避免(一般情况下数据集行大于列$n>>m$,尤其是使用了Matlab命令svd(A,'economy')的时候)。
使用snapshot的方法进行左singular vector的计算
当使用 $\eqref{a}$ 的时候,我们可以获取 $\mathbf{ \hat{V}、\hat{\Sigma}}$ 的值,这个时候我们可以求出 $\mathbf{\hat{U}}$的值为:
$$
\begin{equation}
\mathbf{\hat{U}=\hat{X} V\hat{\Sigma}^{-1}}
\end{equation}
$$
这个方法就是snpshot,因为矩阵$\mathbf{V}$就相当于$\mathbf{X}$在时间序列上的变换,每一列($\mathbf{V^{\top}}$的每一行)相当于一个时间点所有的数据的融合。
Underdetermined system 和overdetermined system
两种系统,用
$$
\begin{equation}
\label{c}
Ax = b
\end{equation}
$$
表示的话,大概是这个样子:
对于第一种不确定系统,其系统矩阵的形状如下:
这种情况下,因为$x$的数量众多,$b$无法提供足够的数量去填充 $x$,因此系统有无数个解,通俗用一个公式解释就是$ 3x_1+4x_2=0$ ,对于$x_1、x_ 2$有无穷多个解满足此公式,因为$b=0,b$的数量只有一个而变量有两个。
另一种情况就是 over determined system,这种情况就是变量过少,结果过多,导致没有一个准确的解。
基于SVD的PCA 分析
对以下视频的一个笔记,观看视频需要梯子。
PCA 算法
话不多说,先上如何计算PCA。
假设$\mathbf{X}$是一个矮胖矩阵:
- 首先对一个矩阵$\mathbf{X}$所有行进行的平均运算,得到一个很胖的单行向量,$1*m$ 维度的矢量$\bar{\mathbf{x}}$ 。
然后进行构建矩阵,用一个单位列向量构建:
$$
\begin{equation}\label{1}
\overline{\mathbf{X}}=\left[\begin{array}{c}
1 \\
\vdots \\
1
\end{array}\right] \overline{\mathbf{x}}
\end{equation}
$$
2. 然后用$X$减去$\bar{X}$得到去掉均值的矩阵$\mathbf{B}$ :
$$
\begin{equation}\label{2.1}
\mathbf{B}=\mathbf{X}-\overline{\mathbf{X}}
\end{equation}
$$
计算$\mathbf{B}$的协方差矩阵 $\mathbf{C}$:
$$
\mathbf{C}=\frac{1}{n-1} \mathbf{B}^{*} \mathbf{B}
$$计算协方差矩阵$\mathbf{C}$的特征值和特征向量:
$$
\begin{equation}
\mathbf{v_{1}^{\top} B^{\top} B v_{1}}
\end{equation}
$$
其中$\mathbf{v_{1}}$是$\mathbf{C}$的第一个特征向量。$\mathbf{V}$是$\mathbf{C}$ 的特征向量矩阵
可以通过特征值分解(eigen-decomposition)进行解析:
$$
\begin{equation}
\begin{aligned}
\mathbf{C V} &=\mathbf{V D} \\
\mathbf{C } &=\mathbf{V D V^{-1}}
\end{aligned}
\end{equation}
$$
其中$\mathbf{D}$是特征值,$\mathbf{V}$是特征向量最后使用$\mathbf{B}$和$\mathbf{V}$ 的乘积求出principal components
$$
\begin{equation}
\mathbf{T}=\mathbf{B V}
\end{equation}
$$
其中$\mathbf{V}$ 称之为loadings在此结果上,因为
$$
\begin{equation}
\mathbf{B=U \Sigma V^{\top}}
\end{equation}
$$
所以的出来principal components可以是:
$$
\begin{equation}
\mathbf{T}=\mathbf{U \Sigma}
\end{equation}
$$
其中$\mathbf{\Sigma}$是$\mathbf{B}$的奇异值,$\mathbf{U}$是左奇异向量。
知识痛点补充:
为什么上述的协方差计算使用$\frac{1}{n-1} $而不是$\frac{1}{n} $作为系数?
首先明确协方差和方差的区别,数据的方差反映的是一个数据集自身的变化程度,也就是这个数据集的离散度,是对一个随机变量的测量值。
协方差则是描述对于不同的,相关的随机变量之间的变化关系,比如一个人的身高和体重两个变量的关系是正相关的,那么这两个变量的协方差就描述了身高和体重的变化之间的相互影响,就是多少身高带来多少体重、或者是多少体重的变化带来多少身高的变化。
因为在我们使用的任何数据集中,基本上都是更大一部分数据集的子集。在这部分数据集中,我们求得的协方差并不是能反映整体数据集的自然误差状态。换句话说,如果我们用$\frac{1}{n} $ 做系数,就相当于我们用了大数据集中的一部分数据的协方差去反映整个大数据集的测量误差,所以用$\frac{1}{n-1}$ 而非$\frac{1}{n} $ 来弥补这种不合理性。比如我们在一个班里抽取学生的身高体重样本来反映整个班级的身高体重水平,班里有100个学生,我们现在取了20个学生(因为我们没有时间把100个学生的身高体重都测量一遍),使用他们的身高体重求协方差,然后用这个协方差去衡量整个班级的身高体重水平,这个时候我们的数据集只是这个大数据集的一小部分,所以我们的衡量是有偏差的,因此我们用$\frac{1}{n-1}$ 而不是$\frac{1}{n}$ 来抵消这种偏差。