协同过滤是通过将用户和其他用户和的数据进行对比来实现推荐。
我们不利用专家所给出的重要属性来描述物品从而计算他们之间的相似度,而是利用用户对他们的意见来计算相似度,这就是协同过滤中所使用的方法。它不关心物品的描述属性,而是严格的按照许多用户的观点来计算相似度。
相似度的度量一种是欧式距离,一种是皮尔逊相关系数,另一种距离计算方法就是余弦相似度。
皮尔逊相关系数的取值范围是从-1到+1,我们通过0.5+0.5*corrcoef()这个函数计算,并且把取值范围归一化到0和1之间
余弦相似度是计算两个向量夹角的余弦值。如果夹角为90度,则相似度为0;如果两个向量的方向相同,则相似度为1.0.同皮尔逊相关系数一样,余弦相似度的取值范围也在-1到+1之间。因此我们也可以将它归一化到0和1之间。
基于物品相似度计算的时间会随物品数量的增加而增加,基于用户的相似度计算的时间复杂度则会随用户数量的增加而增加。
推荐引擎系统的评价指标是称为最小均方根误差(RMSE)的指标,它首先计算均方误差的平均值然后取其平方根。
推荐系统的工作过程是:给定一个用户,系统会为此用户返回N个最好的推荐菜。为了实现这一点,则需要我们做到:
(1)寻找用户没有评级的菜肴,即在用户-五哦i你矩阵中的0值
(2)在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数,这就是说,我们认为用户可能会对物品的打分(这就是我们计算相似度的初衷);
(3)对这些物品的评分从高到低进行排序,返回前N个物品
推荐引擎还存在其他很多规模扩展性的挑战问题,比如矩阵的表示方法。在上面给出的例子中有很多0,实际系统中0的数目很多,也许我们可以通过只存储非零元素来节省内存和计算开销
另一个潜在的计算资源浪费则来自于相似度的得分,在我们的程序中,每次需要一个推荐得分时,都要计算多个物品的相似度得分,这些得分记录的是物品之间的相似度。因此在需要时,这些记录可以被另一个用户重复使用,在实际中,另一个普遍的做法就是离线计算并保存相似度得分。
搜索引擎面临的另一个问题就是如何在缺乏数据时给出好的推荐。这称为冷启动问题,处理起来十分困难,这个为题的另一个说法是,用户不会喜欢一个无效的物品,而用户不喜欢的物品又无效,如果推荐只是一个可有可无的功能,那么上述问题倒不大。但是如果应用的成功与否和推荐的成功与否密切相关,那么问题就变得相当严重了。
冷启动问题的解决方案是将推荐看成是搜索问题,在内部表现上,不同的解决办法虽然有所不同,但是对用户而言确实透明的。为了将推荐看成是搜索问题,我们可能要使用所需要推荐物品的属性。同时,我们也可以将这些属性作为相似度计算所需要的数据,这被称为基于内容的推荐。