Mahout系列之推荐引擎核心源码

           Mahout里面的推荐包括了常见的方法和多种扩充的方法,对推荐的模型做了很好的封装。下面我们就来一起读读源码,读读更健康!

           下载Mahout,本文用到的是apache-mahout-distribution-0.11.0。项目主要包括的子项目有:

项目 说明
mahout-examples     很多关于Mahout的实例                         
mahout-h2o h2o接口项目,随便说下这个h2o也是新兴项目,号称打造类似R、Excel的统计分析工具,将大数据细节隐藏起来,提供统计,机器学习等功能
mahout-hdfs 主要提供了MatrixWritable之类的数据结构
mahout-integration 提供了Mahout和很多其他系统集成的接口,例如:推荐中的读取数据DataModel,wikipedia,各种格式的支持以及很多工具类
mahout-math 不用说,Mahout的计算核心部分,很多和数学相关的数据结构,计算,统计,基础算法,后面很多重点就涉及这里
mahout-math-scala 没错,这部分就是用scala写的,包括分类,聚类,数学计算,nlp之类的
mahout-mr 很多算法的Map-Reduce实现,这里也是Mahout能够分布式运行的重要部分,但是最近Mahout开始不再增加新的mapreduce算法,只是维护旧的,逐步转向spark了
mahout-spark 主要提供了和Spark的基础,包括数据,接口等操作
mahout-spark-shell 提供和spark-shell的交互,只有MahoutSparkILoop 和Main 两个scala代码

        综上所述,主要的是mahout-math mahout-mr两个项目,现在mahout和spark靠的比较近,很多东西也向spark接上了,spark本身也提供了SparkML。

核心接口类

1. DataModel  这个借口封装了对用户物品基本数据部分,提供了获得对用户物品内容的分析基本要求,主要方法包括:

getUserIDs()                getItemIDs()            获得由多少用户,多少物品,返回的结果是一个LongPrimitiveIterator

getPreferencesFromUser(long userID)    getPreferencesForItem(long itemID)    获得某一用户,物品的偏好

getNumUsers()            getNumItems()      获得用户数,物品数

getItemIDsFromUser(long userID)           获得某一用户的物品

getPreferenceValue(long userID, long itemID)     获得某一个用户对某一物品的偏好值

其他的一些就不多说了,有了这个就可以对整个数据集有了大概的了解

主要实现子类有:AbstractDataModel,JDBCDataModel

Mahout系列之推荐引擎核心源码_第1张图片

2.UserSimilarity   提供了计算用户相似度的接口      double userSimilarity(long userID1, long userID2)

Mahout系列之推荐引擎核心源码_第2张图片

       说到计算相似度,我们马上浮想联翩,脑袋里面想到了很多方法。

       CityBlockSimilarity就是 Manhattan距离,计算的方法很简单,先得到两个用户的物品,大小分别为p1,p2,计算两个用户的物品交集intersectionSize,显然intersectionSize在p1和p2之间,距离(distance)就等于p1+p2-2*intersectionSize,相似度就等于1.0 / (1.0 + distance)

       LogLikelihoodSimilarity就是似然相似度,和上面的过程很类似,就是计算方法稍有不同,通过熵来计算。

       SpearmanCorrelationSimilarity 这个Spearman我在之前的文章里面已经说过了

       TanimotoCoefficientSimilarity Mahout的文档这样说:

An implementation of a "similarity" based on the Tanimoto coefficient, or extended Jaccard coefficient.

This is intended for "binary" data sets where a user either expresses a generic "yes" preference for an item or has no preference. The actual preference values do not matter here, only their presence or absence.                The value returned is in [0,1]. 


3.ItemSimilarity    提供了计算物品相似度的接口      double itemSimilarity(long itemID1, long itemID2)

Mahout系列之推荐引擎核心源码_第3张图片

这里面主要是提供了JDBC和文件之类的接口,并没有太多新的计算方法。例如这个TrackItemSimilarity也是和上面的TanimotoCoefficientSimilarity 有些类似。

4.Recommender来真功夫,要开始给推荐东西了

Mahout系列之推荐引擎核心源码_第4张图片

有了上面的东西,推荐就是水到渠成的事情了。

你可能感兴趣的:(数据挖掘)