一需要有喜好值的算法
1、皮尔逊相关系数
定义:两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商
公式:
值域:(-1,1),趋于1紧密,趋于0不紧密,负数为反向相关
缺陷:
(1)没有把两个变量之间重叠部分的元素数量考虑在内
(2)如果两个变量间只有一个重叠元素,则该系数不可计算
(3)如果其中任意一个变量的所有preference都一致,则该系数也无法计算
mahout缺陷解决方案:
(1)在构造函数中加入Weighting.WEIGHTED以考虑重叠元素的数量
UserSimilarity similarity = new CachingUserSimilarity(newPearsonCorrelationSimilarity(model,Weighting.WEIGHTED),model)
2、欧氏距离
定义:n维空间下两个点之间的直线距离
公式:
d=sqrt( ∑(xi1-xi2)^2 )这里i=1,2..n
xi1表示第一个点的第i维坐标,xi2表示第二个点的第i维坐标
n维欧氏空间是一个点集,它的每个点可以表示为(x(1),x(2),...x(n)),其中x(i)(i=1,2...n)是实数,称为x的第i个坐标,两个点x和y=(y(1),y(2)...y(n))之间的距离d(x,y)定义为上面的公式.
值域:(0,+无穷),mahout中做了变化实际返回值为1 / (1+d),d表示欧氏距离,因此在mahout中值域为(0,1),趋近于1相似度越高,趋近于0相似度越低。
缺陷:欧氏距离算法没有皮尔森相关系数的第二和第三个缺陷,欧氏距离向量也可以用Weighting.WEIGHTED解决上述第一个缺陷。
3、余弦相似度
两个变量在n维空间中夹角的余弦值(两个变量在n维空间中的点到原点的连线形成夹角)。
在mahout中,余弦相似度和皮尔逊相关指数是同一个算法。
4、斯皮尔曼等级相关系数
定义:他是皮尔逊相关系数的一个变种,他不直接计算preference,而是将preference转换为一个线性等级值。再计算这个线性等级值得皮尔逊相关系数
二不需要喜好值得算法
1、Tanimoto相似度(Jaccard相似度)
定义:
值域:
实际值域为(0,1),mahout做了转换,similarity = 2 • similarity – 1,所以在mahout中实际值域为(-1,1),趋于1相似度越高,趋于-1相似度越低。
缺陷:没有皮尔逊相关系数的第一个缺陷。
2、log-likehood test(最大似然估计)
Tanimoto相似度算法的最大似然估计,在有些情况下比杰卡德相似度准确度更高
基于项目的推荐引擎实现
与基于用户的推荐引擎相比,他不需要定义相邻项目(ItemNeighborhood),原因在于给定的item中已有相邻项目所需要的信息。
Slop-one推荐引擎
前述的基于用户和基于项目的推荐引擎是适用线性回归分析得到的。为了简化算法、减少存储而采用更简单的回归表达式和自由参数。
在mahout中,slop-one假设在不同项目(item)的评分(preference)之间存在线性关系。
y=mx+b,因此可以基于x项目的评分估计出y项目的评分。slop-one对m做了简化即m=1。对于每个项目对来说,现在只需求出b及b=y-x。因此slop-one推荐引擎需要做提前计算(计算项目对之间的差值),并将计算结果保存起来(一般存在内存中,内存消耗的增长量是项目增量的平方),提前计算的结果也可以保存在数据库里,比如mongodb或mysql,当基础数据集变化的时候直接更新数据库值即可。在实际应用中这种推荐引擎是简单而高效的。
slop-one也像皮尔逊相关系数一样存在缺陷,即每项目对的差值的权重是一样而不考虑他所基于的数据量,所以在mahout中默认提供了两种权重:数量和离散度。
SVD推荐引擎
svd(Singular value decomposition)奇异值分解。
svd推荐引擎对初始数据做了降维处理,因此处理速度更快,svd推荐引擎在工作时需要一个分解因子(Factorizer),一般选用ALSWRFactorizer,ALSWRFactorizer有三个数值型参数,其中第一个是目标属性个数,这个参数没有绝对的答案,但是应该等于影响某个item评分的因子数量,第二个参数是规整化参数,第三个参数是迭代的次数(这个值对效率有影响)。但是这个算法需要将所有数据放入内存,如果缩小结果集并不影响他的正确性。
Knn推荐引擎
K最近邻算法,通过计算样本个体间的距离或者相似度寻找与每个样本个体最相近的K个个体,算法的时间复杂度跟样本的个数直接相关,需要完成一次两两比较的过程。KNN一般被用于分类算法,在给定分类规则的训练集的基础上对总体的样本进行分类,是一种监督学习(Supervised learning)方法。这里我们不用KNN来实现分类,我们使用KNN最原始的算法思路,即为每个内容寻找K个与其最相似的内容,并推荐给用户。相当于每个内容之间都会完成一次两两比较的过程,如果你的网站有n个内容,那么算法的时间复杂度为Cn2,即n(n-1)/2。
这个推荐器的构造函数有四个参数,第一个数据DataModel,第二个是ItemSimilarity,第三个是optimizer,第四个是期望返回的最近节点数量。
基于用户聚集的推荐
该推荐器的思想是先按用户相似度将用户做聚集形成一个层状结果或是一个树状结构,随着对用户信息的完善,用户相似度的度量值也会越来越准确,所以用户聚集的效果也会更准确。然后再将一个item推荐给该用户最紧密的一个cluster里。这种推荐器最适合于给新用户做推荐。其构造函数如下:TreeClusteringRecommender(DataModel dataModel, ClusterSimilarity clusterSimilarity, int numClusters) ,最后一个参数是期望返回的集群数量。
如何将基于内容的推荐整合到mahout中
mahout的各种推荐器是基于相似度度量值的,而相似度度量值来源于user对item的preference,而不关心item或user的各种attribute。但是我们可以将user或item中各个attribute的preference按照加权汇总后生成mahout中需要的preference,从而可以用mahout实现基于content的推荐。
指定权重显得比较武断,更好的办法是根据用户的搜索关键词或信息检索技术对item做分类
。