机器学习——推荐系统
(一)SVD原理分析
人能够对一些事物的重要特征做抽象提取,奇异值分解(Singular Value Decomposition,SVD正是机器抽象提取一些事物重要特征的方法。利用SVD, 可使用小得多的数据集来表示原始数据集,这样会去除噪声数据和冗余信息。
最早的SVD应用之一是信息检索。将利用SVD的方法称为隐性语义索引(Latent Semantic Indexing,LSI)或隐性语义分析(Latent Semantic Analysis,LSA)。
SVD的另一个应用是推荐系统。简单版本的推荐系统能计算项或人之间的相似度。更先进的方法则先利用SVD从数据中构建一个主题空间,然后再在该空间下计算其相似度。
矩阵分解
在很多情况下,数据中的一小段携带了数据集中的大部分信息,而其他信息要么是噪声,要么就是毫不相关的信息。矩阵分解可将原始矩阵表示成新的易于处理的形式,新形式是两个或多个矩阵的乘积。
不同的矩阵分解技术具有不同的性质,其中有些更适合于某个应用,有些则更适合于其他应用。最常见的一种矩阵分解技术就是SVD。SVD将原始的数据集矩阵Data分解成三个矩阵 U U U、 Σ Σ Σ、 V T V^{T} VT。如果原始矩阵Data是m行n列,则有如下等式:
D a t a m × n = U m × m Σ m × n V n × n T Data_{m\times n}=U_{m\times m}\Sigma _{m\times n}V_{n\times n}^{T} Datam×n=Um×mΣm×nVn×nT
上述分解中会构建出一个矩阵 Σ Σ Σ,该矩阵只有对角元素,其他元素均为0。另一个惯例就是, Σ Σ Σ的对角元素是从大到小排列的。这些对角元素称为奇异值(Singular Value),它们对应了原始数据集矩阵Data的奇异值。奇异值和特征值时有关系的。这里的奇异值就是矩阵 D a t a ∗ D a t a T Data∗Data^{T} Data∗DataT特征值的平方根。
矩阵 Σ Σ Σ只有从大到小排列的对角元素。在科学和工程中,一致存在这样一个普遍事实:在某个奇异值的数目(r个)之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征则都是噪声或冗余特征。
利用Python实现SVD
NumPy由一个称为linalg的线性代数工具箱,利用此工具箱可实现如下矩阵的SVD处理:
from numpy import *
U,Sigma,VT=linalg.svd([[1,1],[7,7]])
U
array([[-0.14142136, -0.98994949],
[-0.98994949, 0.14142136]])
Sigma
array([1.00000000e+01, 2.82797782e-16])
VT
array([[-0.70710678, -0.70710678],
[ 0.70710678, -0.70710678]])
接下来在一个更大的数据集上进行更多的分解:
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],
[0, 0, 0, 3, 3],
[0, 0, 0, 1, 1]]
import svdRec as svdRec
Data=svdRec.loadExData()
U,Sigma,VT=linalg.svd(Data)
Sigma
array([9.72140007e+00, 5.29397912e+00, 6.84226362e-01, 4.11502614e-16,
1.36030206e-16])
前三个数据比其他的值大很多,后两个值在不同机器上结果可能会稍有差异,但数量级差不多。于是,我们可将后两个值去掉。原始数据集可用如下结果来近似:
D a t a m × n = U m × 3 Σ 3 × 3 V 3 × n T Data_{m\times n}=U_{m\times 3}\Sigma _{3\times 3}V_{3\times n}^{T} Datam×n=Um×3Σ3×3V3×nT
重构原始矩阵,首先构建一个3x3的矩阵Sig3:
Sig3=mat([[Sigma[0], 0, 0],[0, Sigma[1], 0],[0, 0, Sigma[2]]])
由于Sig3仅为3x3的矩阵,因而只需使用矩阵U的前3列和VT的前三行。为了在Python中实现这一点,输入如下命令:
U[:,:3]*Sig3*VT[:3,:]
matrix([[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,
7.75989921e-16, 7.71587483e-16],
[ 2.00000000e+00, 2.00000000e+00, 2.00000000e+00,
3.00514919e-16, 2.77832253e-16],
[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,
2.18975112e-16, 2.07633779e-16],
[ 5.00000000e+00, 5.00000000e+00, 5.00000000e+00,
3.00675663e-17, -1.28697294e-17],
[ 1.00000000e+00, 1.0