从源代码剖析Mahout推荐引擎

前言
Mahout框架中cf.taste包实现了推荐算法引擎,它提供了一套完整的推荐算法工具集;同时规范了数据结构,并标准化了程序开发过程。应用推荐算法时,代码也就7-8行,简单地有点像R了,为了使用简单的目标,Mahout推荐引擎必然要做到精巧地程序设计。
本文介绍了Mahout推荐引擎的程序设计。


目录

  1. Mahout推荐引擎概况
  2. 标准化的程序开发过程
  3. 数据模型
  4. 相似度算法工具集
  5. 近邻算法工具集
  6. 推荐算法工具集
  7. 创建自己的推荐引擎构造器

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值