洛阳java培训
洛阳王城中心

4000178985

热门课程

商品搜索引擎—推荐系统设计

  • 时间:2018-07-05 15:05
  • 发布:小宝鸽
  • 来源:importnew

一、前言

结合目前已存在的商品推荐设计(如淘宝、京东等),推荐系统主要包含系统推荐和个性化推荐两个模块。

系统推荐: 根据大众行为的推荐引擎,对每个用户都给出同样的推荐,这些推荐可以是静态的由系统管理员人工设定的,或者基于系统所有用户的反馈统计计算出的当下比较流行的物品。

个性化推荐:对不同的用户,根据他们的口味和喜好给出更加精确的推荐,这时,系统需要了解需推荐内容和用户的特质,或者基于社会化网络,通过找到与当前用户相同喜好的用户,实现推荐。

下面具体介绍系统推荐和个性化推荐的设计方案。

二、系统推荐

2.1、系统推荐目的

针对所有用户推荐,当前比较流行的商品(必选) 或 促销实惠商品(可选) 或 新上市商品(可选),以促进商品的销售量。

PS:根据我们的应用情况考虑是否 选择推荐 促销实惠商品 和 新上市商品。(TODO1)

2.2、实现方式

实现方式包含:系统自动化推荐 和 人工设置推荐。

(1)系统自动化推荐考虑因素有:商品发布时间、商品分类、库存余量、历史被购买数量、历史被加入购物车数量、历史被浏览数量、降价幅度等。根据我们当前可用数据,再进一步确定(TODO2)

(2)人工设置:提供运营页面供运营人员设置,设置包含排行位置、开始时间和结束时间、推荐介绍等等。

由于系统推荐实现相对简单,因此不作过多的文字说明,下面详细介绍个性化推荐的设计。

三、个性化推荐

3.1、个性化推荐目的

对不同的用户,根据他们的口味和喜好给出更加精确的推荐,系统需要了解需推荐内容和用户的特质,或者基于社会化网络,通过找到与当前用户相同喜好的用户,实现推荐,以促进商品的销售量。

3.2、三种推荐模式的介绍

据推荐引擎的数据源有三种模式:基于人口统计学的推荐、基于内容的推荐、基于协同过滤的推荐。

(1)基于人口统计学的推荐:针对用户的“性别、年龄范围、收入情况、学历、专业、职业”进行推荐。

(2)基于内容的推荐:如下图,这里没有考虑人对物品的态度,仅仅是因为电影A月电影C相似,因此将电影C推荐给用户A。这是与后面讲到的协同过滤推荐最大的不同。

 

(3)基于协同过滤的推荐:如下图,这里我们并不知道物品A和物品D是否相似,仅仅考虑人对物品的喜好进行推荐。

 

模式采用:这三种模式可以单独使用,也可结合使用。结合我们实际情况,采用基于协同过滤的推荐更加合适,看后期情况是否结合另外两种模式实现推荐。但基于协同过滤的推荐这种模式,会引发“冷启动”问题。关于,冷启动问题,后续会讨论解决方案。

3.3、用户喜好设计

(1)判断用户喜好因素:历史购买、历史购物车、历史搜索、历史浏览等,待确定我们可用数据再进一步细化。

(2)用户对某个商品的喜好程度,通过不同行为对应不同分值权重,如:历史购买(10)、历史购物车(8)、历史搜索(5)、历史浏览(6),确定用户喜好因素后再进一步对各个因素评分权重进行 合理的设计。

(3)用户对商品的喜好程度最终体现:结合某个商品的不同行为 统计出 最终对该商品的喜好程度,即对商品的喜好程度,最终以一个数字体现。

3.4、Mahout介绍

目前选择采用协同过滤框架Mahout进行实现。

Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现、分类、聚类等。Mahout最大的优点就是基于Hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能。

Mahout 是一个布式机器学习算法的集合,但是这里我们只使用到它的推荐/协同过滤算法。

3.5、Mahout实现协同过滤实例

协同过滤在mahout里是由一个叫taste的引擎提供的, 它提供两种模式,一种是以jar包形式嵌入到程序里在进程内运行,另外一种是MapReduce Job形式在hadoop上运行。这两种方式使用的算法是一样的,配置也类似。

这里我们采用第一种引入jar包的单机模式。

3.5.1、依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-core</artifactId>
    <version>0.9</version>
</dependency>
<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-math</artifactId>
    <version>0.9</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.2.1</version>
</dependency>

3.5.2、实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args) {
    try {
        // 从文件加载数据
        DataModel model = new FileDataModel(new File("D:\\mahout\\data.csv"));
        // 指定用户相似度计算方法,这里采用皮尔森相关度
        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
        // 指定用户邻居数量,这里为2
        UserNeighborhood eighborhood = new NearestNUserNeighborhood(2,
                similarity, model);
        // 构建基于用户的推荐系统
        Recommender recommender = new GenericUserBasedRecommender(model,
                neighborhood, similarity);
        // 得到指定用户的推荐结果,这里是得到用户1的两个推荐
        List<RecommendedItem> recommendations = recommender.recommend(1, 2);
        // 打印推荐结果
        for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
        }
    } catch (Exception e) {
        System.out.println(e);
    }
}

3.5.3、data.csv内容(用户id、商品id,评分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1,101,5
1,102,3
1,103,2.5
2,101,2
2,102,2.5
2,103,5
2,104,2
3,101,2.5
3,104,4
3,105,4.5
3,107,5
4,101,5
4,103,3
4,104,4.5
4,106,4
5,101,4
5,102,3
5,103,2
5,104,4
5,105,3.5
5,106,4

3.5.4、运行结果

3.6、Mahout协同过滤算法选用

3.6.1、Mahout协同过滤自带算法介绍

Mahout算法框架自带的推荐器有下面这些:

GenericUserBasedRecommender:基于用户的推荐器,用户数量少时速度快;

GenericItemBasedRecommender:基于商品推荐器,商品数量少时速度快,尤其当外部提供了商品相似度数据后效率更好;

SlopeOneRecommender:基于slope-one算法的推荐器,在线推荐或更新较快,需要事先大量预处理运算,物品数量少时较好;

SVDRecommender:奇异值分解,推荐效果较好,但之前需要大量预处理运算;

KnnRecommender:基于k近邻算法(KNN),适合于物品数量较小时;

TreeClusteringRecommender:基于聚类的推荐器,在线推荐较快,之前需要大量预处理运算,用户数量较少时效果好;

Mahout最常用的三个推荐器是上述的前三个,本文主要讨论前两种的使用。

上一篇:Java8集合中的Lambda表达式
下一篇:Tomcat热部署的实现原理

洛阳java培训班:为 Java 程序员而生的 10+ 最佳库

Java虚拟机学习(1):体系结构 内存模型

选择城市和中心
贵州省

广西省

海南省