Mahout推荐引擎介绍

2014.09.22 | Comments

Mahout 是一个来自 Apache 的、开源的机器学习软件库,他主要关注于推荐引擎(协同过滤)、聚类和分类。

推荐一般是基于物品或者用户进行推荐相关。

聚类是讲大量的事物组合为拥有类似属性的簇,借以在一些规模较大或难于理解的数据集上发现层次结构和顺序,以揭示一些有用的模式或让数据集更易于理解。

分类有助于判断一个新的输入或新的事物是否于以前观察到的模式相匹配,它通常还被用于筛选异常的行为或模式,来检测可疑的网络活动或欺骗行为。

推荐系统

推荐引擎算法应用最广的两大类:基于用户和基于物品的推荐。这两者都是协同过滤的范畴:仅仅通过了解用户于物品之间的关系进行推荐。这些技术无需了解物品自身的属性。 还有基于内容的推荐技术,这需要和特定的领域相结合,mahout 中没有讨论此类算法。

推荐引擎分为5个主要部分组成:数据模型,相似度算法,近邻算法,推荐算法,算法评分器。

数据模型:

  • GenericDataModel:用户ID,物品ID,用户对物品的打分(UserID,ItemID,PreferenceValue)
  • GenericBooleanPrefDataModel: 用户ID,物品ID (UserID,ItemID),这种方式表达用户是否浏览过该物品,但并未对物品进行打分。
  • 内存级 DataModel
  • 基于文件的 DataModel
  • 基于数据库的 DataModel

相似度算法

PearsonCorrelationSimilarity: 皮尔逊相似度

原理:其值为两个序列协方差与二者方差乘积的比值。它度量两个用户针对同一物品的偏好值变化趋势的一致性:都偏高或都偏低。

范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。

问题:

  • 1.没有考虑两个用户同时给出偏好值的物品数目。
  • 2.如果两个用户的交集仅包含一个物品,则无法计算相关性。
  • 3.只要任何一个序列中出现偏好值相同的情况,相关系数都是未定义的。

该相似度并不是最好的选择,也不是最坏的选择,只是因为其容易理解,在早期研究中经常被提起。使用Pearson线性相关系数必须假设数据是成对地从正态分布中取得的,并且数据至少在逻辑范畴内必须是等间距的数据。Mahout中,为皮尔森相关计算提供了一个扩展,通过增加一个权重来使得重叠数也成为计算相似度的影响因子。

EuclideanDistanceSimilarity: 欧氏距离相似度

原理:利用欧式距离d定义的相似度s,s=1 / (1+d)。

范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。

说明:同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响,同样地,Mahout通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

UncenteredCosineSimilarity: 余弦相似度

原理:多维空间两点与所设定的点形成夹角的余弦值。

范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

说明:在数学表达中,如果对两个项的属性进行了数据中心化,计算出来的余弦相似度和皮尔森相似度是一样的,在mahout中,实现了数据中心化的过程,所以皮尔森相似度值也是数据中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity类作为计算非中心化数据的余弦相似度。

SpearmanCorrelationSimilarity: 斯皮尔曼相关系数相似度

原理:斯皮尔曼相关系数通常被认为是排名后的变量之间的皮尔逊线性相关系数。

范围:{-1.0,1.0},当一致时为1.0,不一致时为-1.0。

说明:计算非常慢,有大量排序。针对推荐系统中的数据集来讲,用斯皮尔曼相关系数作为相似度量是不合适的。

TanimotoCoefficientSimilarity: 忽略偏好值基于谷本系数相似度

原理:又名广义Jaccard系数,是对Jaccard系数的扩展。它是两个偏好物品之间的交集大小与并集大小的比值。

范围:[0,1],完全重叠时为1,无重叠项时为0,越接近1说明越相似。

说明:处理无打分的偏好数据。

CityBlockSimilarity: 曼哈顿距离相似度

原理:曼哈顿距离的实现,同欧式距离相似,都是用于多维数据空间距离的测度

范围:[0,1],同欧式距离一致,值越小,说明距离值越大,相似度越大。

说明:比欧式距离计算量少,性能相对高。

LogLikelihoodSimilarity: 对数似然相似度

原理:重叠的个数,不重叠的个数,都没有的个数,计算发生重叠的非偶然概率

范围:具体可去百度文库中查找论文《Accurate Methods for the Statistics of Surprise and Coincidence》

说明:处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。

总结,无偏好的相似度:

  • TanimotoCoefficientSimilarity: 忽略偏好值基于谷本系数相似度
  • LogLikelihoodSimilarity: 对数似然相似度

近邻算法

分为2种:

  • NearestNUserNeighborhood:指定N的个数,比如,选出前10最相似的用户。
  • ThresholdUserNeighborhood:指定比例,比如,选择前10%最相似的用户。

在小数据量情况下,基于物品的推荐算法比基于用户的推荐算法要快。

推荐算法

Slop-one 推荐算法

Slop-one 算法假设两个物品之间存在着某种线性关系,由物品 x 的偏好值可以估计出物品 y 的偏好值。Slop-one 的吸引力在于其算法的在线部分执行很快。

基于SVD 奇异值分解的推荐算法

基于聚类的推荐算法

运行时的推荐很快,因为几乎一切都预先计算好了。但是,这种推荐只能基于一个群组做推荐而不是为个人提供的。另外,聚类的过程非常花时间,在用户数较少时效果很好。

参考文章


原创文章,转载请注明: 转载自JavaChen Blog,作者:JavaChen
本文链接地址:http://blog.javachen.com/2014/09/22/mahout-recommend-engine.html
本文基于署名2.5中国大陆许可协议发布,欢迎转载、演绎或用于商业目的,但是必须保留本文署名和文章链接。 如您有任何疑问或者授权方面的协商,请邮件联系我。