关联规则(Association Rules)原理分析及实例python实现
目录
1.关联规则
关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,如果两个或多个事物之间存在一定的关联关系,那么,其中一个事物就能通过其他事物预测到。关联规则是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。
关联规则挖掘的最经典的例子就是沃尔玛的啤酒与尿布的故事,通过对超市购物篮数据进行分析,即顾客放入购物篮中不同商品之间的关系来分析顾客的购物习惯,发现美国妇女们经常会叮嘱丈夫下班后为孩子买尿布,30%-40%的丈夫同时会顺便购买喜爱的啤酒,超市就把尿布和啤酒放在一起销售增加销售额。有了这个发现后,超市调整了货架的设置,把尿布和啤酒摆放在一起销售,从而大大增加了销售额。
2.常见案例
前面讲述了关联规则挖掘对超市购物篮的例子,使用Apriori对数据进行频繁项集挖掘与关联规则的产生是一个非常有用的技术,其中我们众所周知的例子如:
(1) 沃尔玛超市的尿布与啤酒
(2) 超市的牛奶与面包
(3) 百度文库推荐相关文档
(4) 淘宝推荐相关书籍
(5) 医疗推荐可能的治疗组合
(6) 银行推荐相关联业务 这些都是商务智能和关联规则在实际生活中的运用。
3.置信度与支持度
什么是规则?
规则形如"如果…那么…(If…Then…)",前者为条件,后者为结果。
例如一个顾客,如果买了可乐,那么他也会购买果汁。
如何来度量一个规则是否够好?
有两个量,置信度(Confidence)和支持度(Support),假如存在如下表的购物记录。
TID | item |
001 | I1,I2,I5 |
002 | I2,I4 |
003 | I2,I3 |
004 | I1,I2,I4 |
其中,I={ I1, I2, … Im } 是m个不同项目的集合,集合中的元素称为项目(Item)。
项目的集合I称为项目集合(Itemset),长度为k的项集成为k-项集(k-Itemset)。
设任务相关的数据D是数据库事务的集合,其中每个事务T是项的集合,使得T⊆I。每个事务有一个标识符TID;设A是一个项集,事务T包含A当且仅当A⊆I,则关联规则形式为A=>B(其中A⊂I,B⊂I,并且A∩B= ∅),交易集D中包含交易的个数记为|D|。
在关联规则度量中有两个重要的度量值:
支持度和置信度
对于关联规则R:A=>B,则:
支持度(suppport):是交易集中同时包含A和B的交易数与所有交易数之比。
Support(A=>B)=P(A∪B)=count(A∪B)/|D|
置信度(confidence):是包含A和B交易数与包含A的交易数之比。
Confidence(A=>B)=P(B|A)=support(A∪B)/support(A)
(3) 支持度
支持度(Support)计算在所有的交易集中,既有A又有B的概率。例如在5条记录中,既有橙汁又有可乐的记录有2条。则此条规则的支持度为 2/5=0.4,即:
Support(A=>B)=P(AB)
顾客 | 项目 |
1 | 橙汁、可乐 |
2 | 牛奶,橙汁,空气清洁剂 |
3 |
橙汁、洗洁精 |
4 | 橙汁、洗洁精、可乐 |
5 | 空气清洁剂 |
现在这条规则可表述为,如果一个顾客购买了橙汁,则有50%(置信度)的可能购买可乐。而这样的情况(即买了橙汁会再买可乐)会有40%(支持度)的可能发生。
(4) 置信度
置信度(confidence)表示了这条规则有多大程度上值得可信。设条件的项的集合为A,结果的集合为B。置信度计算在A中,同时也含有B的概率(即:if A ,then B的概率)。即 :
Confidence(A=>B)=P(B|A)
例如计算“如果Orange则Coke”的置信度。由于在含有“橙汁”的4条交易中,仅有2条交易含有“可乐”,其置信度为0.5。
(5) 最小支持度与频繁集
发现关联规则要求项集必须满足的最小支持阈值,称为项集的最小支持度(Minimum Support),记为supmin。支持度大于或等于supmin的项集称为频繁项集,简称频繁集,反之则称为非频繁集。通常k-项集如果满足supmin,称为k-频繁集,记作Lk。关联规则的最小置信度(Minimum Confidence)记为confmin,它表示关联规则需要满足的最低可靠性。
(6) 关联规则
一般来说,只有支持度和置信度均较高的关联规则才是用户感兴趣的、有用的规则。
(7) 强关联规则
如果规则R:X=>Y 满足 support(X=>Y) >= supmin 且 confidence(X=>Y)>=confmin,称关联规则X=>Y为强关联规则,否则称关联规则X=>Y为弱关联规则。
在挖掘关联规则时,产生的关联规则要经过supmin和confmin的衡量,筛选出来的强关联规则才能用于指导商家的决策。
(8) Apriori算法挖掘频繁项集🌟🌟🌟🌟🌟重点
关联规则对购物篮进行挖掘,通常采用两个步骤进行:
a.找出所有频繁项集(文章中我使用Apriori算法>=最小支持度的项集)
b.由频繁项集产生强关联规则,这些规则必须大于或者等于最小支持度和最小置信度。
下面将通超市购物的例子对关联规则挖掘Apriori算法进行分析。
Apriori算法是一种对有影响的挖掘布尔关联规则频繁项集的算法,通过算法的连接和剪枝即可挖掘频繁项集。
Apriori算法将发现关联规则的过程分为两个步骤:
1.通过迭代,检索出事务数据库中的所有频繁项集,即支持度不低于用户设定的阈值的项集;
2.利用频繁项集构造出满足用户最小置信度的规则。
挖掘或识别出所有频繁项集是该算法的核心,占整个计算量的大部分。
补充频繁项集相关知识:
K-项集:指包含K个项的项集;
项集的出现频率:指包含项集的事务数,简称为项集的频率、支持度计数或计数;
频繁项集:如果项集的出现频率大于或等于最小支持度计数阈值,则称它为频繁项集,其中频繁K-项集的集合通常记作Lk。
下面直接通过例子描述该算法:如下表所示,使用Apriori算法关联规则挖掘数据集中的频繁项集。(最小支持度计数为2)
ID | items |
1 | A,C,D |
2 | B,C,E |
3 | A,B,C,E |
4 | B,E |
具体过程如下所示:
具体分析结果:
第一次扫描:对每个候选商品计数得C1,由于候选{D}支持度计数为1<最小支持度计数2,故删除{D}得频繁1-项集合L1;
第二次扫描:由L1产生候选C2并对候选计数得C2,比较候选支持度计数与最小支持度计数2得频繁2-项集合L2;
第三次扫描:用Apriori算法对L2进行连接和剪枝产生候选3项集合C3的过程如下:
1.连接:
C3=L2(连接)L2={{A,C},{B,C},{B,E},{C,E}}{{A,C},{B,C},{B,E},{C,E}}={{A,B,C},{A,C,E},{B,C,E}}
2.剪枝:
{A,B,C}的2项子集{A,B},{A,C}和{B,C},其中{A,B}不是2项子集L2,因此不是频繁的,从C3中删除;
{A,C,E}的2项子集{A,C},{A,E}和{C,E},其中{A,E}不是2项子集L2,因此不是频繁的,从C3中删除;
{B,C,E}的2项子集{B,C},{B,E}和{C,E},它的所有2项子集都是L2的元素,保留C3中。
经过Apriori算法对L2连接和剪枝后产生候选3项集的集合为C3={B,C,E}. 在对该候选商品计数,由于等于最小支持度计数2,故得频繁3-项集合L3,同时由于4-项集中仅1个,故C4为空集,算法终止。
(9)举例:频繁项集产生强关联规则
强关联规:如果规则R:X=>Y满足support(X=>Y)>=supmin(最小支持度,它用于衡量规则需要满足的最低重要性)且confidence(X=>Y)>=confmin(最小置信度,它表示关联规则需要满足的最低可靠性)称关联规则X=>Y为强关联规则,否则称关联规则X=>Y为弱关联规则。
例子:
ID | items |
1 | A,C,D |
2 | B,C,E |
3 | A,B,C,E |
4 | B,E |
现有A、B、C、D、E五种商品的交易记录表,找出所有频繁项集,假设最小支持度>=50%,最小置信度>=50%。
对于关联规则R:A=>B,则:
支持度(suppport):是交易集中同时包含A和B的交易数与所有交易数之比。
Support(A=>B)=P(A∪B)=count(A∪B)/|D|
置信度(confidence):是包含A和B交易数与包含A的交易数之比。
Confidence(A=>B)=P(B|A)=support(A∪B)/support(A)
计算过程如下,K=1的时候项集{A}在T1、T3中出现2次,共4条交易,故支持度为2/4=50%,依次计算。其中项集{D}在T1出现,其支持度为1/4=25%,小于最小支持度50%,故去除,得到L1。
然后对L1中项集两两组合,再分别计算其支持度,其中项集{A, B}在T3中出现1次,其支持度=1/4=25%,小于最小支持度50%,故去除,同理得到L2项集。
然后如下图所示,对L2中的项集进行组合,其中超过三项的进行过滤,最后计算得到L3项集{B,C,E}。
最后对计算置信度,如下图所示。
(10)python代码
基于上面的例子我们用代码实现一下
首先安装pymining
[code]pip install pymining
[code]from pymining import itemmining, assocrules
定义数据集
[code]transactions = (('a', 'c', 'd'), ('b', 'c', 'e'), ('a','b', 'c', 'e'), ('b', 'e'))
[code]relim_input = itemmining.get_relim_input(transactions)
[code]report = itemmining.relim(relim_input, min_support=2)
[code]rules1 = assocrules.mine_assoc_rules(report, min_support=2, min_confidence=0.5)
我们可以筛选下第三次扫描结果
[code]for line in rules1: if len(line[0])>1 or len(line[1])>1 : print(line)
代码输出结果跟我们上面手算结果一致。
阅读更多
- Python实现的堆排序算法原理与用法实例分析
- Python实现的插入排序算法原理与用法实例分析
- Python实现希尔排序算法的原理与用法实例分析
- Python实现的选择排序算法原理与用法实例分析
- Python实现的基数排序算法原理与用法实例分析
- Holt-Winters模型原理分析及代码实现(python)
- python实现数值积分的Simpson方法实例分析
- select函数详解及实例分析及内核实现原理
- 随机森林的原理分析及Python代码实现
- python实现马耳可夫链算法实例分析
- python中self原理实例分析
- fisher判别分析原理+python实现
- Spring3.1.0实现原理分析(六).实例化
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
- python实现关联规则分析Apriori算法
- Python实现程序的单一实例用法分析
- Spring3.1.0实现原理分析(六).实例化
- python实现bucket排序算法实例分析
- 决策树原理实例(python代码实现)
- python实现bucket排序算法实例分析