首页 > 其他 > 详细

14-利用SVD简化数据

时间:2016-05-18 23:33:50      阅读:255      评论:0      收藏:0      [点我收藏+]

 

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简化数据

原文:http://www.cnblogs.com/hudongni1/p/5507006.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!