PS:该系列数据都可以在图灵社区(点击此链接)中随书下载中下载(如下)
1 SVD的应用
奇异值分解
优点:简化数据,去除噪声,提高算法的结果。
缺点:数据的转换可能难以理解。
适用数据类型:数值型数据。
1.1 隐形语义索引
最早的SVD应用之一就是信息检索。我们称利用SVD的方法为隐性语义索引(Latent Semantic Index, LSI) 或隐性语义分析(Latent Semantic Analysis,LSA)。
1.2 推荐系统
SVD的另一个应用是推荐系统。简单版本的推荐系统能够计算项或者人之间的相似度。更先进的方法则先利用SVD从数据中构建一个主题空间,然后再在该空间下计算其相似度。考虑下图给出的矩阵,它是由餐馆的菜和品菜师对这些菜的意见构成的。品菜师可以采用1到5之间的任意一个整数来对菜评级。如果品菜师没有尝过某道菜,则评级为0。
对上述矩阵进行SVD处理,会得到两个奇异值。我们可以把奇异值想象成一个新空间。与上图中给出矩阵的五维或者七维不同,我们最终的矩阵只有二维。这二维分别对应上右图给出的两个组,我们可以基于每个组的共同特征来命名这二维,比如我们得到美式BBQ和日式食品这二维。
2 矩阵分解
SVD将原始的数据集矩阵Data分解成三个矩阵 U U U、 ∑ \sum ∑和 V T V^T VT。如果原始矩阵Data是m行n列,那么 U U U、 ∑ \sum ∑和 V T V^T VT就分别是m行m列、m行n列和n行n列。上述过程可以写成如下一行(下标为矩阵维数):
Data m × n = U m × n ∑ m × n V n × n T \operatorname{Data}_{m \times n}=U_{m \times n} \sum_{m \times n} V_{n \times n}^{\mathrm{T}} Datam×n=Um×nm×n∑Vn×nT
上述分解中会构建出一个矩阵∑,该矩阵只有对角元素,其他元素均为0。另一个惯例就是,∑的对角元素是从大到小排列的。这些对角元素称为奇异值(Singular Value),它们对应了原始数据集矩阵Data的奇异值。奇异值就是矩阵 D a t a ∗ D a t a T Data * Data^T Data∗DataT特征值的平方根。
在科学和工程中,一直存在这样一个普遍事实:在某个奇异值的数目(r个)之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征都是噪声或冗余特征。
3 利用Python实现SVD
Numpy有一个称为linalg的线性代数工具箱:
注意Sigma以行向量array([10., 0.])
返回,而非矩阵形式,这是由于Sigma矩阵除了对角元素其他均为0,因此这种仅返回对角元素的方式能够节省空间。
建立文件svdRec.py,编写如下代码并进行测试:
import numpy as np
def loadExData():
return [[1, 1, 1, 0, 0],
[2, 2, 2, 0, 0],
[1, 1, 1, 0, 0],
[5, 5, 5, 0, 0],
[1, 1, 0, 2, 2],
[