Created
March 19, 2014 12:39
-
-
Save huowa222/9640835 to your computer and use it in GitHub Desktop.
similarity caculation Mahout Apache OpenSource
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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