奇异值分解简要笔记

て烟熏妆下的殇ゞ 提交于 2020-01-18 19:35:43

特征值分解

特征值分解可以看作是换基,线性变换在新基下表现为仅仅是对各个坐标轴做伸缩,然后再换回原来的基。
对称矩阵的特征值分解有更好的性质,它可以保证新基是标准正交基。

对称矩阵

正交对角化

对称矩阵有非常好的性质——可以正交对角化。
就是说对称矩阵A可以用特征值和特征向量分解成A=PDPTA=PDP^T的形式。
其中D是对角矩阵,对角线上是A的特征值。P的列向量是A的标准正交基。
这个形式很好,P是正交矩阵,对应是正交变换。正交变换保留了内积,所以也就保留了角度和距离。这在分类和聚类里面都是很重要的,因为衡量两个向量相似度就是用角度或者距离。
正交变换从几何上看就是旋转(或者旋转加镜面反转)。

谱分解

P的列是一组标准正交基:
P=[u1,,un]P = [\mathbf{u}_1, \cdots , \mathbf{u}_n]
那么A可以分解成n个矩阵的和:
A=λ1u1u1T+λ2u2u2T++λnununTA=\lambda_1 \mathbf{u}_1 \mathbf{u}_1^T + \lambda_2 \mathbf{u}_2 \mathbf{u}_2^T + \cdots + \lambda_n \mathbf{u}_n \mathbf{u}_n^T

普通矩阵分解

普通矩阵就不像对称矩阵那么好可以正交对角化。但是普通矩阵可以做奇异值分解,它与对称矩阵的正交对角化是类比关系。

奇异值分解

设A是一个m×nm \times n的矩阵,则它可以分解成:
A=UΣVT A = U \Sigma V^T
U是m×mm \times m的正交矩阵,Σ\Sigmam×nm \times n的“对角”矩阵,加引号是因为真正的对角矩阵必须是正方形的,V是n×nn \times n的正交矩阵。Σ\Sigma的对角线上是A的奇异值。

奇异值分解的展开形式

类似谱分解,奇异值分解也可以展开成多个矩阵的和。
U=[u1,,um]U = [u_1, \cdots, u_m]V=[v1,,vn]V = [v_1, \cdots, v_n]
那么A可以写成:
A=σ1u1v1T+σ2u2v2T++σrurvrT A = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \cdots + \sigma_r u_r v_r^T
其中σi\sigma_i是矩阵A的各个奇异值。

Reduced SVD

假设矩阵A的秩是rrr<mr < mr<nr < n
A的奇异值有0,那么还可以只保留Σ\Sigma中的非零值,变成由A的非零奇异值组成的对角矩阵DD。U、V也只需要保留前r行。
A=UrDVrT A = U_r D V_r^T
其中UrU_rm×rm \times r矩阵,D是r×rr \times rVTV^Tr×nr \times n
UrU_rAA列空间的标准正交基。
VrV_rAA的行空间的标准正交基。
网上很多博客说的SVD其实是特指这一种。

一个SVD两种看法

一、主成分分析

从展开形式看,SVD可以用于压缩图片。只取前几大奇异值之和,直接抛弃后面的影响力较小的奇异值,就能用于压缩图片
想知道压缩后保留了多少原图片的信息,可以计算percetage of explained variance,就是计算保留的奇异值平方和占总奇异值平方和之比例。这是根据SVD与主成分分析的关系。
将矩阵A看成是m维随机变量取样n次。(样本)协方差矩阵的特征值之和就是总方差,而奇异值是这个特征值的平方根。

二、潜在语义分析

Reduced和展开式两者结合——只取前几个较大的奇异值,就叫做truncated SVD。从truncated SVD形式看,SVD可以看作是降维的手段,也用于潜在语义分析。
把原来矩阵每列看成Rm\mathbb{R}^m中的一个向量。奇异值分解相当于把它投影到Rr\mathbb{R}^r上。从m维降到r维。
因为UrU_r是A的列向量的一组标准正交基。也就是说A的每一列都可以写成UrU_r的列的线性组合,这个组合的权重就是降维后的坐标。

原矩阵降维

降维后的A就是ΣVT\Sigma V^{T}。A是m×nm \times n,而降维后成了r×nr \times n

新向量降维

一个新的向量y\mathbf{y}要降维到UrU_r的空间,可以根据正交投影的公式:
projy=UUTy \operatorname{proj}{\mathbf{y}} = U U^T \mathbf{y}
根据上面公式我们知道,y的投影用U_r线性表示其权重是UrTyU_r^T\mathbf{y},这就是y降维后的坐标。所以降维公式是:
UrTy U_r^T \mathbf{y}

实际使用

实际使用的时候往往A是上述描述A的转置。以潜在语义分析为例,按照上述描述A应该是 term-document 矩阵(行是词,列是文档)。
但是实际使用中往往是转置过来,A是document-term矩阵,行是文档,列是词。所以上面说的两个公式要转置一下。

代码实现

SVD是数值计算标准算法之一。除了上述两种应用以外,SVD本身就是很多数值算法的基础。所以早就有很多实现。python科学计算、机器学习相关的很多库都有SVD,比如
numpy有np.linalg.svd
scipy的scipy.sparse.linalg有svds
sklearn也有实现了好几种SVD类——
from sklearn.decomposition import TruncatedSVD。

用于文档潜在语义分析可以先用sklearn.feature_extraction.text.TfidfVectorizer将文档转换成“文档-TFIDF”矩阵,然后再用SVD分解。
sklearn没有stemmer,可以定制Vectorizer的analyzer,调用NLTK的stemmer先转换为词干。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!