在做了之前的推荐计算和推荐数据的表示之后,让我们真正进入到推荐器本身的详细内容中,这才是干货。


在Mahout中两种众所周知的推荐算法:基于用户,以及基于商品的推荐器。本章深入讲解背后的理论,以及Mahout中的实现。这两个算法都是依赖于相似度的度量。有很多种定义相似度的方式,本章会具体介绍在Mahout中如何使用你的选择。其中的实现包括Pearson关联,log likelihood Spearman关联,Tanimoto系数 等等。

最终,你会熟悉其他类型的推荐器:slope-one,基于SVD的,基于聚类的

4.1 理解基于用户的推荐器
如果之前你对推荐算法有所耳闻,那有很大几率是基于用户的推荐算法。它是早期研究出来的,Mahout实现了它。基于用户的讲法并不是很准确,因为任何的推荐算法都是基于用户或者商品相关的数据的。之所以被定义为基于用户的推荐算法,是基于它对相似度的标注是基于用户之间的。事实上,你可能每天都会碰到这类推荐。

4.1.1 推荐何时出错
这里出错在相似的度量并不是有效的,虽然说青年群里是会有相对相同的音乐口味,但是这个相似度太弱了而不能起效。女青年并不见得与男青年在音乐上有足够的相同点形成基础的推荐。
 
4.1.2 推荐何时是对的
这个就比上例要好一点。两个好朋友在音乐上有相似的口味,这比说两个相互陌生的青年有相似的兴趣要好的多。更好的是下面这个例子:
这里他们就直接得涉及到了对音乐的口味了。两个小孩对某些类型音乐有相似的爱好,那么他们对其他音乐也会有相似的爱好。
这就是基于用户的推荐的基本逻辑
 
4.2 深入研究基于用户的推荐算法
接下来这两个大人有可能做的事情是:为什么只根据一个小孩的口味来判断呢,可以找到其他几个相似的小孩,然后找一个最相似的进行推荐。
 
4.2.1 算法
incorporate : 合并  即preference*s 求加权平均
 
考虑到对每个商品计算用户间的相似度有冗余,且计算量巨大。因此,用户间的相似度要事先计算好,并且取TopN相似的用户所知的产品作为推荐考虑的对象。改进后的算法是这个样子:
 
4.2.2 用GenericUserBasedRecommender实现算法
代码4.1中 UserSimilarity记录了两个用户的相似信息,而UserNeighborhood封装了一组具有相似偏好的用户信息。这些是标准基于用户的推荐中必须的组件。
 
可以有多种可能的相似度信息,也可以有多种方式来定义相邻用户(取5个,20个,或者高于一个特定值的)。举例婚礼嘉宾选择与相似用户选取的比对
由上我们可以得到推荐器的必要组件:
得到好的结果并使推荐更快,是不容否认的漫长的实验和调优过程
 
4.2.3 以GroupLen数据做实验,讲述推荐流程,分别有规定size的邻居以及规定阈值的邻居算法。
 
4.3 相似性度量
相似性度量是比较关键的一步。
4.3.1 基于Pearson-Correlation的相似性