SVD简介

一、回顾:特征分解
特征值和特征向量的定义如下:

Ax=λx

Ann , xn1 , λ 是矩阵 A 的一个特征值,而 x λ 所对应的特征向量。
利用特征值和特征向量,我们可以对矩阵进行矩阵分解。如果我们求出了矩阵 A n 个特征值 λ1,λ2,...,λn 对应的特征向量依次是 w1,w2,...,wn ,则矩阵A可以用特征分解的形式表示:
A=WΣW1

其中 W 是由n个特征向量张成的 n x n 维矩阵。
一般我们会把 W 的这 n x n 特征向量标准化,即满足 ||wi||2=1 , 或者说 wTiwi=1 ,此时 W 的 n 个特征向量为标准正交基,满足 WTW=I ,即 WT=W1 , 也就是说W为酉矩阵。
这样我们的特征分解表达式可以写成
A=WΣWT

注意: 要进行特征分解,矩阵 A 必须为方阵。
思考: 那么如果 A 不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?

答案:可以。即SVD出现了。

二、奇异值分解 参照博文
SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个 m×n 的矩阵,那么我们定义矩阵A的SVD为:

A=UΣVT

其中 U 是一个 m×m 的矩阵,Σ是一个 m×n 的矩阵,除了主对角线上的元素以外全是0,有一个惯例是将Σ的对角元素从大到小排列。主对角线上的每个元素都称为奇异值。V是一个 m×m 的矩阵。U 和 V 都是酉矩阵,即满足 UTU=I,VTV=I
这里写图片描述

这里写图片描述
这里写图片描述

三、奇异值分解的作用

优点: 简化数据,去除噪声,提高算法的结果。
缺点: 数据的转换可能难以理解。
适用数据类型:数值型数据。

利用SVD实现,我们能够用小的多的数据集来表示原始数据集,这样做,实际上是去除了噪声和冗余信息。这对于节省空间,是很崇高的目标。这里我们是从数据集中抽取信息,基于这个视角,我们可以把SVD看成是从有噪声的数据中抽取相关特征。

四、奇异值分解的实现:

Datam×n=Um×mΣm×nVTn×n

奇异值和特征值是有关系的。奇异值就是矩阵 DataDataT 特征值的平方根。
由于矩阵 Σ 只有从大到小排列的对角元素,且有事实:在某个奇异值的数目(r个)之后,其他的奇异值都置为0。 这意味着数据中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。
在Numpy库中有一个称为linalg的线性代数工具箱,内有实现SVD的方法。

扫描二维码关注公众号,回复: 4766903 查看本文章

示例1、:

这里写图片描述

注意:

Sigma是以行向量返回,而非矩阵,因为Sigma除了主对角线上的元素外都为0,因此,这种仅返回对角元素的方式能够节省空间。但我们自己要明确 Σ 是一个矩阵。

示例二、

from numpy import linalg
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]]
>>> from numpy import linalg
>>> import svdRec
>>> Data=svdRec.loadExData()
>>> U, Sigma, VT=linalg.svd(Data)
>>> print Sigma
[  9.72140007e+00   5.29397912e+00   6.84226362e-01   1.25958571e-15
   2.05750739e-31]

可看出前3个数值比其他的值大多了,于是我们可以将最后两个值去掉。即原始数据集就可以用如下结果进行表示:

Datam×nUm×3Σ3×3VT3×n

重构原始矩阵的近似矩阵

>>> from numpy import *
>>> Sig3 = mat([[Sigma[0], 0, 0], [0, Sigma[1], 0], [0, 0, Sigma[2]]]) #使用矩阵U的前三列和VT的前三行
>>> U[:, :3]*Sig3*VT[:3, :]

这里写图片描述

确定要保留的奇异值的数目的策略:
1、典型的做法:保留矩阵中90%的能量信息。为计算总能量信息,将所有的奇异值求平方和,于是可以将奇异值的平方和累加到总值的90%为止。
2、当矩阵上有上万的奇异值时,就保留前面的2000或3000个。

五、SVD的应用
比较流行的SVD应用的例子—推荐引擎
5.1、推荐引擎案例:
1. Amazon根据顾客的购买历史向他们推荐物品;
2. 向用户推荐电影;
3. 新闻网站向用户推荐新闻报道。
5.2、实现推荐功能的方法:协同过滤
协同过滤: 是通过将用户和其他用户的数据进行对比来实现推荐。

应用:当我们试图对某个用户喜欢的电影进行预测,推荐引擎会发现有一部电影该用户还没看过。然后它就会计算该电影和用户看过的电影之间的相似度,如果其相似度很高,推荐算法就会认为用户喜欢这部电影。
上述场景下,唯一所需要的数学方法就是相似度的计算。

5.2.1:相似度的计算
协同过滤中使用的计算相似度的方法: 利用用户对它们的意见来计算相似度。它不关心物品的描述属性,而是严格地按照许多用户的观点来计算相似度。

例子:下图给出了由一些用户及其对前面给出的部分菜肴的评价信息所组成的矩阵。
这里写图片描述
有三种方法计算相似度:

1、使用欧氏距离来计算:相似度=1/(1+距离);当距离为0时,相似度为1.0;如果距离真的非常大时,相似度也就趋于0。
2、皮卡逊系数(pearson correlation): 度量的是两个向量之间的相似度;

2.1. 优势:对用户评级的量级并不敏感;比如某个狂躁者对所有物品的评分都是5,而另一个忧郁者对所有物品的评分都是1,皮卡逊相关系数会认为这两个向量是相等的。
2.2. Numpy中,皮卡逊相关系数的计算是由函数corrcoef()进行的。
2.3. 皮卡逊相关系数的取值范围从-1到1,可以通过 0.5+0.5*corrcoef()这个函数计算,并且把其取值范围归一化到0到1之间。
3、余弦相似度: 计算的是两个向量夹角的余弦值。如果夹角为90度,则相似度为0;如果两个向量的方向相同,则相似度为1.0。
3.1. 和皮卡逊相关系数一样,余弦相似度的取值范围也在-1到+1之间,因此也可以将其归一化到-1到0之间。
3.2. 计算余弦相似度的值,采用的是两个向量A 和 B
夹角的余弦相似度的定义如下: cosθ=AB||A||||B||
其中, ||A||||B|| 表示向量 AB 的2范数。

主要应用皮卡逊系数:
这里写图片描述
这里写图片描述

5.2.2:基于物品的相似度还是基于用户的相似度?
取决于物品或用户的数目。如果用户的数目很多,那么我们倾向于使用基于物品相似度的计算方法。
5.2.3:推荐引擎的评价
可以采用交叉测试的方法。具体是:将某些已知的评价值去掉,然后对他们进行预测,最后计算预测值和真实值之间的差异。
用于推荐引擎评价的指标是:最小均方根误差(RMSE);其首先计算均方误差的平均值然后取其平方根。

猜你喜欢

转载自blog.csdn.net/zyy848877920/article/details/79033416
SVD