前言
Mahout框架中cf.taste包实现了推荐算法引擎,它提供了一套完整的推荐算法工具集;同时规范了数据结构,并标准化了程序开发过程。应用推荐算法时,代码也就7-8行,简单地有点像R了,为了使用简单的目标,Mahout推荐引擎必然要做到精巧地程序设计。
本文介绍了Mahout推荐引擎的程序设计。
目录
- Mahout推荐引擎概况
- 标准化的程序开发过程
- 数据模型
- 相似度算法工具集
- 近邻算法工具集
- 推荐算法工具集
- 创建自己的推荐引擎构造器
1.Mahout推荐引擎概况
Mahout推荐引擎,要从org.apache.mahout.cf.taste包说起:
packages的说明:common: 公共类包括,异常,数据刷新接口,权重常量
1. eval: 定义构造器接口,类似于工厂模式
2. model: 定义数据模型接口
3. neighborhood: 定义近邻算法的接口
4. recommender: 定义推荐算法的接口
5. similarity: 定义相似度算法的接口
6. transforms: 定义数据转换的接口
7. hadoop: 基于hadoop的分步式算法的实现类
8. impl: 单机内存算法实现类
从上面的package情况,我可以粗略地看出推荐引擎分为5部分:数据模型,相似度算法,近邻算法,推荐算法,算法评分器。
从数据处理能力上,算法可以分为:单机内存算法,基于hadoop的分布式算法。
下面我们将基于单机内存算法,研究Mahout的推荐引擎的结构:
2.标准化的程序开发过程
以UserCF的标准化算法为例,官方建议我们的开发过程:
从上图中我们可以看到,算法是被模块化的,通过1234的过程进行方法调用。
程序代码:
public class UserCF {
final static int NEIGHBORHOOD_NUM = 2;
final static int RECOMMENDER_NUM = 3;
public static void main(String[] args) throws IOException, TasteException {
String file = "datafile/item.csv";
DataModel model = new FileDataModel(new File(file));
UserSimilarity user = new EuclideanDistanceSimilarity(model);
NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
Recommender r = new GenericUserBasedRecommender(model, neighbor, user);
LongPrimitiveIterator iter = model.getUserIDs();
while (iter.hasNext()) {
long uid = iter.nextLong();
List list = r.recommend(uid, RECOMMENDER_NUM);
System.out.printf("uid:%s", uid);
for (RecommendedItem ritem : list) {
System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue());
}
System.out.println();
}
}
}
我们调用算法的程序,要用4个对象:DataModel,UserSimilarity,NearestUserNeighborhood,Recommender 。
3.数据模型
Mahout的推荐引擎的数据模型,以DataModel接口为父类。
通过“策略模式”匹配不同的数据源,支持File,JDBC(MySQL,PostgreSQL),NoSQL(Cassandra,HBase,MongoDB).
注:NoSQL的实现在mahout-integration-0.8.jar中。
数据格式支持2种:
1. GenericDataModel: 用户ID,物品ID,用户对物品的打分(UserID,ItemID,PreferenceValue)
2. GenericBooleanPrefDataModel: 用户ID,物品ID (UserID,ItemID),这种方式表达用户是否浏览过该物品,但并未对物品进行打分。
4.相似度算法工具集
相似算法分为2种:
1. 基于用户(UserCF)的相似度算法
2. 基于物品(ItemCF)的相似度算法
1).基于用户(UserCF)的相似度算法
计算用户的相似度矩阵,可以通过上图中几种算法。
2).基于物品(ItemCF)的相似度算法
计算物品的相似度矩阵,可以通过上图几种算法。
关于相似度距离的说明:
1. EuclideanDistanceSimilarity: 欧氏距离相似度
原理:利用欧式距离d定义的相似度s,s=1 / (1+d)。