Skip to content

Instantly share code, notes, and snippets.

@huowa222
Created March 19, 2014 12:39
Show Gist options
  • Save huowa222/9640835 to your computer and use it in GitHub Desktop.
Save huowa222/9640835 to your computer and use it in GitHub Desktop.
similarity caculation Mahout Apache OpenSource
Apache Mahout 是 ApacheSoftware Foundation (ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序,并且,在 Mahout 的最近版本中还加入了对Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。
在现实中广泛使用的推荐系统一般都是基于协同过滤算法的,一般分为基于用户(user)的协同过滤算法和基于项目(item)的协同过滤算法,这类算法通常都需要计算user和user,item和item之间的相似度,对于不同的数据量和不同类型的数据源,都需要不同的相似度计算方法来提高推荐性能和提高推荐的准确度,幸好在mahout中提供了大量的计算相似度的组件,这些组件实现了一些不同的相似度计算方法:
如图1:基于user的相似度计算
1.Pearson correlation-based similarity(皮尔森用户协同推荐算法)(一般不建议使用)
(PearsonCorrelationSimilarity) 根据用户对于物品的喜好分数进行用户的打分进行推荐,用户之间的相似度从-1~1
范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。
问题所在:对于小数据,就是数据之间没有关联数据,他可能推荐不出来。或者对于一些问题,比如用户之间有共同评价的是200个东西,但是分数不一样,有可能比只评价了2个共同物品的相似度还低。
(但是可以添加用户之间相似度的权重来进行算法推荐,可能会对上述的问题起到缓解的作用。)
该相似度并不是最好的选择,也不是最坏的选择,只是因为其容易理解,在早期研究中经常被提起。使用Pearson线性相关系数必须假设数据是成对地从正态分布中取得的,并且数据至少在逻辑范畴内必须是等间距的数据。Mahout中,为皮尔森相关计算提供了一个扩展,通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。
2.similarity by Euclidean distance(欧几里得距离决定的相似度,利用欧式距离d定义的相似度s,s=1 / (1+d)。)
范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大
(EuclideanDistanceSimilarit)根据欧几里得距离进行判定用户的相似度,1/(1+d) ,其中d就是欧几里得距离。
同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响,同样地,Mahout通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。
3.cosine measure similarity(余弦相似度度量)
范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。
(CosineMeasureSimilarity)根据空间的余弦值进行判断相似度(-1~1)
4.Spearman correlation (等级相关的相似度度量)(实际使用很少,因为计算比较慢,有大量排序)
范围:{-1.0,1.0},当一致时为1.0,不一致时为-1.0。
(SpearmanCorrelationSimilarity)会根据你对物品的喜好程度进行自定义排级进行推荐。
5.Tanimoto coefficient(谷本系数) -----值得使用
范围:[0,1],完全重叠时为1,无重叠项时为0,越接近1说明越相似。
(TanimotoCoefficientSimilarity) 会忽略掉你对物品的喜好值,只会根据喜好程度多少进行判断相似度。
6.log-likelihood test(对数似然函数) 和谷本系数 很相似 但是貌似更好
(LogLikelihoodSimilarity)
如图2:基于item的相似度计算
1 GenericItemBasedRecommender 这是一般的基于item的过滤。
但是构造item相似度的时候一般还是使用的用户协同过滤算法,因为物品的相似度是由用户的喜好决定的,所以一般在构造GenericItemBasedRecommender的时候会需要两个参数,model和ItemSimilarity
(并不是所有用户协同过滤算法都继承了ItemSimilarity)
这是几个继承了ItemSimilarity的用户过滤算法,
a PearsonCorrelationSimilarity (或者加 weighting)
b EuclideanDistanceSimilarit (或者加 weighting)
c TanimotoCoefficientSimilarity
d LogLikelihoodSimilarity
2 Slope-one recommender( 线性推荐)
在实际进行使用的时候,还需要对用户使用情况进行 ‘数量’ 上的加权和 ‘标准差’ 上的加权,能够改善 线性推荐算法使用的数据不一定是有效数据的弱点。SlopeOneRecommender offers two types of weighting: weighting based on count, and on standard deviation.
而且在实际使用的时候 ,线性推荐算法非常的耗费内存,分布式存储可以有效的解决这个问题。
DiffStorage 默认的使用是用 MemoryDiffStorage 还有MySQLJDBCDiffStorage 可以供使用。
3 现在还有一些比较新的 或者 实验性质的 基于item的协同推荐算法
如:a Singular value decomposition-based recommenders (SVDRecommender)
b Linear interpolation item-based recommendation (KnnItemBasedRecommender)
c Cluster-based recommendation (NearestNeighborClusterSimilarity,FarthestNeighborClusterSimilarity)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment