14-利用SVD简化数据

 参考:http://blog.csdn.net/geekmanong/article/details/50494936

         http://www.2cto.com/kf/201503/383087.html

 

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.示例:基于物品相似度的餐馆菜肴推荐引擎

 

posted @ 2016-05-18 22:46  hudongni1  阅读(358)  评论(0编辑  收藏  举报