mahout中的相似度算法

来源:互联网 发布:手机如何改淘宝评价 编辑:程序博客网 时间:2024/06/08 02:20

mahout中的相似度算法


一需要有喜好值的算法

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个坐标,两个点xy=(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转换为一个线性等级值。再计算这个线性等级值得皮尔逊相关系数


二不需要喜好值得算法

1Tanimoto相似度(Jaccard相似度)

定义:


两个集合AB的交集元素在AB的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。



值域:

实际值域为(0,1),mahout做了转换,similarity = 2 • similarity – 1,所以在mahout中实际值域为(-1,1),趋于1相似度越高,趋于-1相似度越低。


缺陷:没有皮尔逊相关系数的第一个缺陷。


2log-likehood test(最大似然估计)

Tanimoto相似度算法的最大似然估计,在有些情况下比杰卡德相似度准确度更高


基于项目的推荐引擎实现

与基于用户的推荐引擎相比,他不需要定义相邻项目(ItemNeighborhood),原因在于给定的item中已有相邻项目所需要的信息。


Slop-one推荐引擎

前述的基于用户和基于项目的推荐引擎是适用线性回归分析得到的。为了简化算法、减少存储而采用更简单的回归表达式和自由参数。

mahout中,slop-one假设在不同项目(item)的评分(preference)之间存在线性关系。

y=mx+b,因此可以基于x项目的评分估计出y项目的评分。slop-onem做了简化即m=1。对于每个项目对来说,现在只需求出bb=y-x。因此slop-one推荐引擎需要做提前计算(计算项目对之间的差值),并将计算结果保存起来(一般存在内存中,内存消耗的增长量是项目增量的平方),提前计算的结果也可以保存在数据库里,比如mongodbmysql,当基础数据集变化的时候直接更新数据库值即可。在实际应用中这种推荐引擎是简单而高效的。

slop-one也像皮尔逊相关系数一样存在缺陷,即每项目对的差值的权重是一样而不考虑他所基于的数据量,所以在mahout中默认提供了两种权重:数量和离散度。


SVD推荐引擎

svdSingular value decomposition)奇异值分解。

SVD推荐的想法抽象点来看就是将一个NM列的评分矩阵RR[u][i]代表第u个用户对第i个物品的评分),分解成一个NF列的用户因子矩阵PP[u][k]表示用户u对因子k的喜好程度)和一个MF列的物品因子矩阵QQ[i][k]表示第i个物品的因子k的程度)。用公式来表示就是
R = P * T(Q)               //T(Q)
表示Q矩阵的转置



实际上一个用户对某个项目的评分会受到严格评分者和已有评分情况的影响。为了提高精确度,需要该井svd的模型,即:


R = OverallMean + biasU + biasI + P * T(Q) 
其中OverallMean表示所有preference的平均分,biasU表示用户评分偏离OverallMean的程度,biasI表示项目评分偏离OverallMean的程度,PQ意思不变。特别注意,这里除了OverallMean之后,其它几个都是矩阵。



评分公式:


bu表示第u个用户的偏离程度,bi表示第i部电影的偏离程度,pu表示第u个用户的因子爱好程度,qi表示第i部电影的因子程度。


svd推荐引擎对初始数据做了降维处理,因此处理速度更快,svd推荐引擎在工作时需要一个分解因子(Factorizer),一般选用ALSWRFactorizerALSWRFactorizer有三个数值型参数,其中第一个是目标属性个数,这个参数没有绝对的答案,但是应该等于影响某个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的各种推荐器是基于相似度度量值的,而相似度度量值来源于useritempreference,而不关心itemuser的各种attribute。但是我们可以将useritem中各个attributepreference按照加权汇总后生成mahout中需要的preference,从而可以用mahout实现基于content的推荐。

指定权重显得比较武断,更好的办法是根据用户的搜索关键词或信息检索技术对item做分类




原创粉丝点击