特征值分解
特征值分解可以看作是换基,线性变换在新基下表现为仅仅是对各个坐标轴做伸缩,然后再换回原来的基。
对称矩阵的特征值分解有更好的性质,它可以保证新基是标准正交基。
对称矩阵
正交对角化
对称矩阵有非常好的性质——可以正交对角化。
就是说对称矩阵A可以用特征值和特征向量分解成的形式。
其中D是对角矩阵,对角线上是A的特征值。P的列向量是A的标准正交基。
这个形式很好,P是正交矩阵,对应是正交变换。正交变换保留了内积,所以也就保留了角度和距离。这在分类和聚类里面都是很重要的,因为衡量两个向量相似度就是用角度或者距离。
正交变换从几何上看就是旋转(或者旋转加镜面反转)。
谱分解
P的列是一组标准正交基:
那么A可以分解成n个矩阵的和:
普通矩阵分解
普通矩阵就不像对称矩阵那么好可以正交对角化。但是普通矩阵可以做奇异值分解,它与对称矩阵的正交对角化是类比
关系。
奇异值分解
设A是一个的矩阵,则它可以分解成:
U是的正交矩阵,是的“对角”矩阵,加引号是因为真正的对角矩阵必须是正方形的,V是的正交矩阵。的对角线上是A的奇异值。
奇异值分解的展开形式
类似谱分解,奇异值分解也可以展开成多个矩阵的和。
设,
那么A可以写成:
其中是矩阵A的各个奇异值。
Reduced SVD
假设矩阵A的秩是,且
A的奇异值有0,那么还可以只保留中的非零值,变成由A的非零奇异值组成的对角矩阵。U、V也只需要保留前r行。
其中是矩阵,D是,是。
是的列空间
的标准正交基。
是的行空间的标准正交基。
网上很多博客说的SVD其实是特指这一种。
一个SVD两种看法
一、主成分分析
从展开形式看,SVD可以用于压缩图片。只取前几大奇异值之和,直接抛弃后面的影响力较小的奇异值,就能用于压缩图片
。
想知道压缩后保留了多少原图片的信息,可以计算percetage of explained variance,就是计算保留的奇异值平方和占总奇异值平方和之比例。这是根据SVD与主成分分析的关系。
将矩阵A看成是m维随机变量取样n次。(样本)协方差矩阵的特征值之和就是总方差,而奇异值是这个特征值的平方根。
二、潜在语义分析
Reduced和展开式两者结合——只取前几个较大的奇异值,就叫做truncated SVD。从truncated SVD形式看,SVD可以看作是降维
的手段,也用于潜在语义分析。
把原来矩阵每列看成中的一个向量。奇异值分解相当于把它投影到上。从m维降到r维。
因为是A的列向量的一组标准正交基。也就是说A的每一列都可以写成的列的线性组合,这个组合的权重就是降维后的坐标。
原矩阵降维
降维后的A就是。A是,而降维后成了。
新向量降维
一个新的向量要降维到的空间,可以根据正交投影的公式:
根据上面公式我们知道,y的投影用U_r线性表示其权重是,这就是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先转换为词干。
来源:CSDN
作者:hohomi77
链接:https://blog.csdn.net/hohomi77/article/details/104031471