推荐系统之基于关联规则推荐

简介: 笔记

(1)基于关联规则推荐原理详解


关联规则是反映一个事物与其他事物之间的相互依存性和关联性,常用于实体商店或在线电商的推荐系统:通过对顾客的购买记录数据库进行关联规则挖掘,最终目的是发现顾客群体的购买习惯的内在共性,例如购买产品A的同时也连带购买产品B的概率,根据挖掘结果,调整货架的布局陈列、设计促销组合方案,实现销量的提升,最经典的应用案例莫过于《啤酒和尿布》。


关联规则分析中的关键概念包括:支持度(Support)、置信度(Confidence)与提升度(Lift)


我举一个超市购物的例子,下面是几名客户购买的商品列表:


11.png

(1.1)支持度(Support)

支持度是个百分比,它指的是某个商品组合出现的次数与总次数之间的比例。在这个例子中,我们能看到“牛奶”出现了4次,那么这5笔订单中“牛奶”的支持度就是4/5=0.8。

12.png

同样“牛奶+面包”出现了3次,那么这5笔订单中“牛奶+面包”的支持度就是3/5=0.6


13.png

(1.2)置信度(Confidence)

它指的就是当你购买了商品A,会有多大的概率购买商品B,置信度是个条件概念,就是说在A发生的情况下,B发生的概率是多少14.png


置信度(牛奶→啤酒) =2/4=0.5,代表如果你购买了牛奶,有多大的概率会购买啤酒


置信度(啤酒一牛奶)=2/3=0.67,代表如果你购买了啤酒,有多大的概率会购买牛奶

15.png


(1.3)提高度

置信度(啤酒→牛奶)=2/3=0.67,代表如果你购买了啤酒,有多大的概率会购买牛奶

提升度(A→B)=置信度(A→B)/支持度(B)


这个公式是用来衡量A出现的情况下,是否会对B出现的概率有所提升。所以提升度有三种可能:

提升度(A→B)> 1:代表有提升;

提升度(A→B)= 1:代表有没有提升,也没有下降;

提升度(A→B)< 1:代表有下降。


(2)关联规则推荐算法-Apriori原理图例数据详解


Apriori的工作原理


首先我们把上面案例中的商品用ID来代表,牛奶、面包、尿布、可乐、啤酒、鸡蛋的商品ID分别设置为1-6,上面的数据表可以变为:

牛奶一1、面包一2、尿布一3、可乐一4、啤酒一5、鸡蛋一6
1

Apriori 算法其实就是查找频繁项集(frequent itemset)的过程,所以首先我们需要定义什么是频繁项集。


频繁项集就是支持度大于等于最小支持度(Min Support)阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集。

项集这个概念,英文叫做itemset,它可以是单个的商品,也可以是商品的组合。

我们再来看下这个例子,假设我随机指定最小支持度是50%,也就是0.5。


我们来看下 Apriori 算法是如何运算的:


首先,我们先计算单个商品的支持度,也就是得到K=1项的支持度:

16.png

因为最小支持度是0.5,所以你能看到商品4、6是不符合最小支持度的,不属于频繁项集,于是经过筛选商品的频繁项集就变成:

17.png

在这个基础上,我们将商品两两组合,得到k=2项的支持度18.png


在这个基础上,我们将商品两两组合,得到k=2项的支持度,并再筛掉小于最小值支持度的商品组合,可以得到:19.png


我们再将商品进行K=3项的商品组合,可以得到:

20.png

再筛掉小于最小值支持度的商品组合,可以得到

21.png

通过上面这个过程,我们可以得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。

Apriori算法的递归流程:

1、K=1,计算K项集的支持度;

2、筛选掉小于最小支持度的项集;

3、如果项集为空,则对应K-1项集的结果为最终结果。


否则K=K+1,重复1-3步。


(3)关联规则推荐算法-FP-Growth图例数据详解


Apriori的改进算法:FP-Growth算法


Apriori在计算的过程中有以下几个缺点:


可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了;

每次计算都需要重新扫描数据集,来计算每个项集的支持度。

所以 Apriori算法会浪费很多计算空间和计算时间,为此人们提出了FP-Growth算法:


创建了一棵FP树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。

整个生成过程只遍历数据集2次,大大减少了计算量。

所以在实际工作中,我们常用FP-Growth来做频繁项集的挖掘,下面我给你简述下FP-Growth的原理。


1.创建项头表 (item header table)

创建项头表的作用是为FP构建及频繁项集挖掘提供索引

这一步的流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。(第一步遍历数据集就删除了不满足最小支持度的项,降低了时间复杂度;同时降序排列可以公用祖先节点-null点)


项头表包括了项目、支持度,以及该项在FP树中的链表。初始的时候链表为空。

22.png

2.构建FP树 (item header table)

因为根据参数阈值,第一次扫描就已经剔除了阈值外的数据,对商品用字母表示


A一牛奶;B一面包;C一尿布;D一可乐;E一啤酒;F一鸡蛋
1

23 - 副本.png

25.png

24 - 副本.png




(4)关联规则推荐算法-FP-Growth详解与Spark代码开发


FP-Growth代码开发

package com.similarity
import org.apache.spark.ml.fpm.FPGrowth
import org.apache.spark.sql.SparkSession
object FpGrouthTest {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder
      .appName(this.getClass.getName)
      .master("local[5]")
      .getOrCreate
    // 设置日志等级
    spark.sparkContext.setLogLevel("WARN")
    import spark.implicits._
    val dataSet = spark.createDataset(Seq(
      "A B C",
      "B C E",
      "A C E",
      "B A C E",
      "B A C"
    )).map(x => x.split(" ")).toDF("items")
    val fpGrouth = new FPGrowth().setMinSupport(0.5).setMinConfidence(0.5).setItemsCol("items")
    val fpModel = fpGrouth.fit(dataSet)
    // 生成频繁详集
    fpModel.freqItemsets.show(false)
    /**
     * +---------+----+
     * |items    |freq|
     * +---------+----+
     * |[C]      |5   |
     * |[A]      |4   |
     * |[A, C]   |4   |
     * |[B]      |4   |
     * |[B, A]   |3   |
     * |[B, A, C]|3   |
     * |[B, C]   |4   |
     * |[E]      |3   |
     * |[E, C]   |3   |
     * +---------+----+
     */
    fpModel.associationRules.show(false)
    fpModel.transform(dataSet).show(false)
    /**
     * +------------+----------+
     * |items       |prediction|
     * +------------+----------+
     * |[A, B, C]   |[E]       |
     * |[B, C, E]   |[A]       |
     * |[A, C, E]   |[B]       |
     * |[B, A, C, E]|[]        |
     * |[B, A, C]   |[E]       |
     * +------------+----------+
     */
  }
}

FP-Growth验证

26.png

27.png28.png29.png30.png31.png32.png33.png


相关文章
|
存储 算法 搜索推荐
# 【推荐系统】:关联规则
# 【推荐系统】:关联规则
# 【推荐系统】:关联规则
|
机器学习/深度学习 人工智能 搜索推荐
推荐系统:ARL(关联规则学习)
一家公司的产品内容一般都是非常丰富的,但用户的兴趣往往会针对整个内容集进行筛选,挑选出用户感兴趣的产品,筛选的规则因人而异。为了让用户不迷失在丰富的产品集群中,并根据兴趣领域达到所需的个性化服务,一般都会制作各种过滤器。这些过滤器和算法显示就是我们的“推荐系统”。
210 0
|
3月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
152 1
|
5月前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
5月前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
3月前
|
搜索推荐 前端开发 数据可视化
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
本文介绍了一个基于Python协同过滤算法的旅游景点推荐系统,该系统采用Django框架、MySQL数据库、Bootstrap前端和echarts数据可视化技术,旨在为用户提供个性化的旅游推荐服务,提升用户体验和旅游市场增长。
276 9
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
|
3月前
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
251 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
6月前
|
搜索推荐 算法 前端开发
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
193 4
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
|
5月前
|
机器学习/深度学习 搜索推荐 算法
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
登录注册 热门图书 图书分类 图书推荐 借阅图书 购物图书 个人中心 可视化大屏 后台管理
13128 2
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统