使用Mahout实现推荐系统(一):MySQL数据源的简单推荐

     最近在做推荐系统,以前从没接触过难过,通过查阅,了解到一些推荐系统相关的开源框架,对比了下,使用Java开发的Mahout比较适合,通过学习,简单实现了一些功能,通过这篇文章记录一下,后续学习到进一步用法还会更新这个系列。

      使用mysql作为数据源,新建一张用户行为偏好表ratings,包含四个字段,用户id(user_id),商品id(item_id),偏好打分(rating),时间戳(timestamp)。将相关数据存进表中,接下来就可以在项目里使用mahout。

      首先在pom文件里加入依赖(前提是一个maven项目,嘿嘿):

<dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout</artifactId>
            <version>0.11.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout-examples</artifactId>
            <version>0.11.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

       使用步骤:

  1. 首先定义数据模型(DataModel),我理解为Mahout的数据源,这个数据源包含数据库操作,可以理解为Mybatis的sessionfactory,MaHout默认提供了较多种DataModel,比如MYSQLJDBCDataModel,用于mysql数据库的操作,HBaseDataModel,用于hbase数据库的操作,FileDataModel,用于文件存储数据的操作(例如csv),等等。以mysql作为数据源为例子,代码如下:
DataModel dataModel = new MySQLJDBCDataModel(DataSource dataSource,
String preferenceTable,
String userIDColumn,
String itemIDColumn,
String preferenceColumn,
String timestampColumn);
从变量名大致也能猜出来,需要数据源DataSource、记录偏好打分的表名、用户id对应的列名、产品id对应的列名、偏好打分值对应的列名、时间戳对应的列名。

  1. 定义相似度策略(Similarity),分为用户相似度策略(UserSimilarity)和产品相似度策略()默认提供了几种实现,比如皮尔斯(PearsonCorrelationSimilarity)、EuclideanDistanceSimilarity,代码:UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
需要将上一步定义的DataModel传进去。

  1. 定义邻居(UserNeighborhood),所谓邻居,即具有相似性行为偏好的用户
UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, userSimilarity, dataModel);
需要的参数:邻居数量、第二步定义的用户相似度、第一步定义的数据模型

  1. 定义推荐器(Recommender),推荐器有基于用户的推荐(GenericUserBasedRecommender)和基于商品的推荐(GenericItemBasedRecommender),当然,还有一些其他的推荐
GenericUserBasedRecommender recommender =
new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity);
需要的参数:数据模型、邻居、用户相似度策略

  1. 使用推荐器,根据推荐器不同调用不同的方法,例如GenericUserBasedRecommender基于用户推荐,通过调用recommend(long userID, int howMany)方法,传入用户的id以及需要返回的推荐数量。GenericItemBasedRecommender基于商品相似推荐,通过调用recommendedBecause(long userID, long itemID, int howMany)方法即可,传入用户id,当前浏览的商品的id,返回推荐的数目。

至此就可以完成mahout结合数据源的单机版开发。

猜你喜欢

转载自blog.csdn.net/wetsion/article/details/80160706