14-利用SVD简化数据

Posted hudongni1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14-利用SVD简化数据相关的知识,希望对你有一定的参考价值。

 

SVD(Singular Value Decomposition)奇异值分解:

优点:用来简化数据,去除噪声,提高算法的结果。

缺点:数据的转换可能难以理解。

适用数据类型:数值型数据。

一、SVD与推荐系统

下图由餐馆的菜和品菜师对这些菜的意见组成,品菜师可以采用1到5之间的任意一个整数来对菜评级,如果品菜师没有尝过某道菜,则评级为0

技术分享

建立一个新文件svdRec.py并加入如下代码:

def loadExData():  
    return[[0, 0, 0, 2, 2],  
           [0, 0, 0, 3, 3],  
           [0, 0, 0, 1, 1],  
           [1, 1, 1, 0, 0],  
           [2, 2, 2, 0, 0],  
           [5, 5, 5, 0, 0],  
           [1, 1, 1, 0, 0]]
u, s, vt = la.svd(loadExData())
print s
#[  9.64365076e+00   5.29150262e+00   9.99338251e-16   4.38874654e-16
#   1.19121230e-16]

我们可以发现得到的特征值,前两个比其他的值大很多,所以可以将最后三个值去掉,因为他们的影响很小。

可以看出上图中前三个人,喜欢烤牛肉和手撕猪肉,这些菜都是美式烧烤餐馆才有的菜,这两个特征值可以分别对应到美食BBQ和日式食品两类食品上,所以可以认为这三个人属于一类用户,下面四个人属于一类用户,这样推荐就很简单了。

建立一个新文件svdRec.py并加入如下代码:

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]] 
u, s, vt = la.svd(loadExData())
print s
#[  9.72140007e+00   5.29397912e+00   6.84226362e-01   1.18665567e-15
#   3.51083347e-16]

我们可以发现得到的特征值,前3个比其他的值大很多,所以可以将最后2个值去掉,因为他们的影响很小。

技术分享

技术分享

技术分享

上面例子就可以将原始数据用如下结果近似:
技术分享

二、基于协同过滤的推荐引擎

协同过滤(collaborative filtering)是通过将用户与其他用户的数据进行对比来实现推荐的。

1.相似度计算

 技术分享

def ecludSim(inA,inB):
    return 1.0/(1.0 + la.norm(inA - inB))  #计算向量的第二范式,相当于直接计算了欧式距离
 
def pearsSim(inA,inB):
    if len(inA) < 3 : return 1.0
    return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1] #corrcoef直接计算皮尔逊相关系数。pearsSim会检查是否存在3个或更多的点。不存在返回1,因为此时两个向量完全相关。
 
def cosSim(inA,inB):
    num = float(inA.T*inB)
    denom = la.norm(inA)*la.norm(inB)
    return 0.5+0.5*(num/denom)  #计算余弦相似度

2.基于物品的相似度与基于用户的相似度

  当用户数目很多时,采用基于物品的相似度计算方法更好。

3.示例:基于物品相似度的餐馆菜肴推荐引擎

技术分享

 

以上是关于14-利用SVD简化数据的主要内容,如果未能解决你的问题,请参考以下文章

利用 SVD 实现协同过滤推荐算法

SVD

机器学习——利用SVD简化数据

推荐系统矩阵分解MF利用BASIC-SVD分解

机器学习:降维工具 - SVD

利用SVD-推荐未尝过的菜肴