数据挖掘中的关联关系+Apriori算法+FPGrowth算法




推荐系统中常用的几种算法:

        基于内容的推荐(静态):内容特征表示,特征学习,推荐列表

        基于协同过滤的推荐(动态):群体智能、用户历史行为

        基于关联规则的推荐:Transaction 频繁项集和关联规则挖掘

        基于效率的推荐:效用函数的调用

        基于知识图谱的推荐:知识图谱的创建

        组合推荐:实际工作中经常使用


关联规则 Association Rules or  Basket Analysis 


订单关系

 1、 支持度

                百分比,指的是商品组合出现的次数与总次数的比例,支持度越高,代表这个商品出现的频率越大。

        ‘牛奶’的支持度 = 4/5 =0.8

        ‘牛奶+面包’ = 3/5 = 0.6

        2、 置信度:是个条件概念,指当你买了商品A,会有多大的概率买商品b

        置信度(牛奶->啤酒) = 2/4 = 0.5

        置信度(啤酒->牛奶) = 2/3 = 0.67

        如果我们单纯看置信度(可乐->尿布)= 1,也就是说可乐出现的时候,用户都会购买尿布。那么当用户买可乐的时候,就需要推荐尿布么?答案是否定的,如果该小店以卖尿布为准

        3、提升度:商品a的出现,对商品b的出现概率提升程度

        提升度(a->b)= 置信度(a->b)/ 支持度(b)

        提升度的三种可能:

        提升度(a->b)> 1:代表有提升

        提升度(a->b)= 1: 代表没有提升也没有下降

        提升度(a->b)< 1:代表有下降

        4、Apriori算法:就是查找频繁项集(frequent itemset) 的过程

        频繁项集(闺蜜):支持度大于等于最小的支持度(MIn Support)阈值的项集

        非频繁项集:支持度小于最小支持度的项集

案例
1、上面案例中的商品用ID来表示

牛奶、面包、尿布、可乐、啤酒、鸡蛋
先计算k=1的支持度 

假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集

最小支持度=0.5

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

筛选掉小于最小值支持度的商品组合

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

筛选掉小于最小值支持度的商品组合


得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。


Apriori算法的流程:

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

Step2,筛选掉小于最小支持度的项集;

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

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


使用工具包:

from efficient_apriori import apriori

或者:

from mlxtend.frequent_patterns import apriori

代码如下:

代码

关联分析的使用场景,万物皆Transaction:

        超市购物小票(TransactionID => Item)

        github项目路径:

        每部电影的分类(MovieID => 分类)

        github项目路径:

        每部电影的演员(MovieID => 演员)

         github项目路径:


关联规则与协同过滤的区别

关联规则是基于transaction,而协同过滤基于用户偏好(评分)

商品组合使用的是购物篮分析,也就是Apriori算法,协同过滤计算的是相似度

关联规则没有利用“用户偏好”,而是基于购物订单进行的频繁项集挖掘

关联规则与协同过滤的区别

1、推荐使用场景:

当下的需求:

推荐的基础是且只是当前一次的购买/点击

长期偏好:

基于用户历史的行为进行分析,建立一定时间内的偏好排序

两种推荐算法的思考维度不同,很多时候,我们需要把多种推荐方法的结果综合起来做一个混合的推荐

关联规则的视角

不需要考虑用户一定时期内的偏好,而是基于Transaction

只要能将数据转换成Transaction,就可以做购物篮分析:

Step1、把数据整理成id=>item形式,转换成transaction

Step2、设定关联规则的参数(support、confident)挖掘关联规则

Step3、按某个指标(lift、support等)对以关联规则排序

关联规则中的最小支持度、最小置信度该如何确定

最小支持度,最小置信度是实验出来的

最小支持度:

不同的数据集,最小值支持度差别较大。可能是0.01到0.5之间

可以从高到低输出前20个项集的支持度作为参考

最小置信度:可能是0.5到1之间

提升度:表示使用关联规则可以提升的倍数,是置信度与期望置信度的比值

提升度至少要大于1

Apriori在计算的过程中存在的不足:

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

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

浪费了计算空间和时间

FPGrowth算法

在Apriori算法基础上提出了FP-Growth算法:

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

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

理解:Apriori存在的不足,有更快的存储和搜索方式进行频繁项集的挖掘

步骤

创建项头表(item header table)

作用是为FP构建及频繁项集挖掘提供索引。

Step1、流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。

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

Step2、对于每一条购买记录,按照项头表的顺序进行排序,并进行过滤。

构造FP树,根节点记为NULL节点

Step3、整个流程是需要再次扫描数据集,把Step2得到的记录逐条插入到FP树中。节点如果存在就将计数count+1,如果不存在就进行创建。同时在创建的过程中,需要更新项头表的链表。

Step4、通过FP树挖掘频繁项集

现在已经得到了一个存储频繁项集的FP树,以及一个项头表。可以通过项头表来挖掘出每个频繁项集。

挖掘从项头表最后一项“啤酒”开始。

从FP树种找到所有“啤酒”节点,向上遍历祖先节点,得到3条路径。对于每条路径上的节点,其count都设置为“啤酒”的count

具体的操作会用到一个概念,叫“条件模式基”

因为每项最后一个都是“啤酒”,因此我们把“啤酒”去掉,得到条件模式基,此时后缀模式是(啤酒)

假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},此时的条件频繁项集为{{}, {尿布}},所以啤酒的频繁项集为{啤酒},{尿布,啤酒}

继续找项头表倒数第2项面包,求得“面包”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}



继续找项头表倒数第3项面包,求得“牛奶”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{牛奶},{尿布,牛奶}


继续找项头表倒数第4项面包,求得“尿布”的条件模式基

根据条件模式基,可以求得尿布的频繁项集:{尿布}

所以全部的频繁项集为:

{啤酒},{尿布,啤酒}

{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}

{牛奶},{尿布,牛奶}

{尿布}


工具包

通过Python官方的第三方软件库

https://pypi.org/

import fptools as fp

Spark.mllib 提供并行FP-growth算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355