奇异值分解(Singular Value Decomposition,SVD)能够用小得多的数据集去表示原始数据集。实际上是去除了噪声和冗余数据,达到节省空间的目的;也可以用于从数据中提取信息。
SVD的典型应用:
- 隐性语义索引。奇异值代表文档中的概念或主题,提高文档搜索效率。可有效解决词语拼写错误、使用同义词表达的问题。
- 推荐系统。利用SVD从数据中构建一个主题空间,然后再在这个主题空间下计算相似度从而进行推荐。
矩阵分解
即将原始矩阵表示成两个或多个矩阵的乘积。

表示成图的形式如下

上述分解中会构建出一个矩阵 Σ ,该矩阵只有对角元素,其他元素均为0。通常Σ 的对角元素是从大到小排列。这些对角元素称为奇异值(Singular Value),它们对应了原始数据集矩阵 Data 的奇异值。奇异值和特征值的关系是:奇异值就是矩阵Data⋅DataT特征值的平方根。
利用Python实现SVD
求解SVD
Numpy有一个称为linalg的线性代数工具箱可以实现SVD。例如对以下矩阵
在python中键入命令进行处理
>>> from numpy import *
>>> U,Sigma,VT=linalg.svd([[1,1],[1,7]])
>>> U
array([[ 0.16018224, 0.98708746],
[ 0.98708746, -0.16018224]])
>>> Sigma
array([ 7.16227766, 0.83772234])
>>> VT
array([[ 0.16018224, 0.98708746],
[ 0.98708746, -0.16018224]])
注意:Sigma返回的是对角线元素。
奇异值数目的确定
- 将所有的奇异值求其平方和,累加到总值的90%为止。
- 当矩阵有上万的奇异值时,保留前面的2000或3000个。
重构原始矩阵的近似矩阵
假定奇异值的个数为3,输入命令:
U[:,3] * Sig3 * VT[:3,:]
其中,Sig3是奇异值构成的对角矩阵
在应用中的作用
- 在基于协同过滤的推荐引擎应用中,SVD的作用是利用分解出来的U矩阵将物品转换到低维空间中,然后再低维空间中计算相似度。
xformedItems = data.T * U[:,:3] * Sig3.I
话外:皮尔逊相关系数对用户评级的量级并不敏感,给所有物品评价为1和给所有物品评价为5的做法是相等的。
相似度标准化公式:相似度 = 1 / (1 + 距离)
- 在图像压缩中,只存储奇异值(假定保留k个奇异值)、U矩阵的前k列和VT矩阵的前k行,从而实现压缩。
网友评论