【机器学习实战】利用SVD简化数据

奇异值分解(Singular Value Decomposition,SVD)能够用小得多的数据集去表示原始数据集。实际上是去除了噪声和冗余数据,达到节省空间的目的;也可以用于从数据中提取信息。

SVD的典型应用:

  1. 隐性语义索引。奇异值代表文档中的概念或主题,提高文档搜索效率。可有效解决词语拼写错误、使用同义词表达的问题。
  2. 推荐系统。利用SVD从数据中构建一个主题空间,然后再在这个主题空间下计算相似度从而进行推荐。

矩阵分解

即将原始矩阵表示成两个或多个矩阵的乘积。


表示成图的形式如下


【机器学习实战】利用SVD简化数据_第1张图片

上述分解中会构建出一个矩阵 Σ ,该矩阵只有对角元素,其他元素均为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返回的是对角线元素。

奇异值数目的确定

  1. 将所有的奇异值求其平方和,累加到总值的90%为止。
  2. 当矩阵有上万的奇异值时,保留前面的2000或3000个。

重构原始矩阵的近似矩阵

假定奇异值的个数为3,输入命令:

     U[:,3] * Sig3 * VT[:3,:]

其中,Sig3是奇异值构成的对角矩阵

在应用中的作用

  1. 在基于协同过滤的推荐引擎应用中,SVD的作用是利用分解出来的U矩阵将物品转换到低维空间中,然后再低维空间中计算相似度。

xformedItems = data.T * U[:,:3] * Sig3.I

话外:皮尔逊相关系数对用户评级的量级并不敏感,给所有物品评价为1和给所有物品评价为5的做法是相等的。
相似度标准化公式:相似度 = 1 / (1 + 距离)

  1. 在图像压缩中,只存储奇异值(假定保留k个奇异值)、U矩阵的前k列和VT矩阵的前k行,从而实现压缩。

你可能感兴趣的:(【机器学习实战】利用SVD简化数据)