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
2.UserSimilarity 提供了计算用户相似度的接口 double userSimilarity(long userID1, long userID2)
说到计算相似度,我们马上浮想联翩,脑袋里面想到了很多方法。
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)
这里面主要是提供了JDBC和文件之类的接口,并没有太多新的计算方法。例如这个TrackItemSimilarity也是和上面的TanimotoCoefficientSimilarity 有些类似。
4.Recommender来真功夫,要开始给推荐东西了
有了上面的东西,推荐就是水到渠成的事情了。