理解关联规则apriori算法:Apriori算法是第一个关联规则挖掘算法,也是最经典的算法,它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接【类矩阵运算】与剪枝【去掉那些没必要的中间结果】组成。

理解关联规则apriori算法:

一、概念

表1 某超市的交易数据库交易号TID顾客购买的商品交易号TID顾客购买的商品

T1bread, cream, milk, teaT6bread, tea

T2bread, cream, milkT7beer, milk, tea

T3cake, milkT8bread, tea

T4milk, teaT9bread, cream, milk, tea

T5bread, cake, milkT10bread, milk, tea

定义一:设I={i1,i2,…,im},是m个不同的项目的集合,每个ik称为一个项目。项目的集合I称为项集。其元素的个数称为项集的长度,长度为k的项集称为k-项集。引例中每个商品就是一个项目,项集为I={bread, beer, cake,cream, milk, tea},I的长度为6。

定义二:每笔交易T是项集I的一个子集。对应每一个交易有一个唯一标识交易号,记作TID。交易全体构成了交易数据库D,|D|等于D中交易的个数。引例中包含10笔交易,因此|D|=10。

定义三:对于项集X,设定count(X⊆T)为交易集D中包含X的交易的数量,则项集X的支持度为:

support(X)=count(X⊆T)/|D|

引例中X={bread, milk}出现在T1,T2,T5,T9和T10中,所以支持度为0.5。

定义四:最小支持度是项集的最小支持阀值,记为SUPmin,代表了用户关心的关联规则的最低重要性。支持度不小于SUPmin 的项集称为频繁集,长度为k的频繁集称为k-频繁集。如果设定SUPmin为0.3,引例中{bread, milk}的支持度是0.5,所以是2-频繁集。

定义五:关联规则是一个蕴含式:

R:X⇒Y

其中X⊂I,Y⊂I,并且X∩Y=⌀。表示项集X在某一交易中出现,则导致Y以某一概率也会出现。用户关心的关联规则,可以用两个标准来衡量:支持度和可信度。

定义六:关联规则R的支持度是交易集同时包含X和Y的交易数与|D|之比。即:

support(X⇒Y)=count(X⋃Y)/|D|

支持度反映了X、Y同时出现的概率。关联规则的支持度等于频繁集的支持度。

定义七:对于关联规则R,可信度是指包含X和Y的交易数与包含X的交易数之比。即:

confidence(X⇒Y)=support(X⇒Y)/support(X)

可信度反映了如果交易中包含X,则交易包含Y的概率。一般来说,只有支持度和可信度较高的关联规则才是用户感兴趣的。

定义八:设定关联规则的最小支持度和最小可信度为SUPmin和CONFmin。规则R的支持度和可信度均不小于SUPmin和CONFmin ,则称为强关联规则。关联规则挖掘的目的就是找出强关联规则,从而指导商家的决策。

这八个定义包含了关联规则相关的几个重要基本概念,关联规则挖掘主要有两个问题:找出交易数据库中所有大于或等于用户指定的最小支持度的频繁项集。

利用频繁项集生成所需要的关联规则,根据用户设定的最小可信度筛选出强关联规则。

目前研究人员主要针对第一个问题进行研究,找出频繁集是比较困难的,而有了频繁集再生成强关联规则就相对容易了。

二、理论基础

首先来看一个频繁集的性质。

定理:如果项目集X是频繁集,那么它的非空子集都是频繁集。

根据定理,已知一个k-频繁集的项集X,X的所有k-1阶子集都肯定是频繁集,也就肯定可以找到两个k-1频繁集的项集,它们只有一项不同,且连接后等于X。这证明了通过连接k-1频繁集产生的k-候选集覆盖了k-频繁集。同时,如果k-候选集中的项集Y,包含有某个k-1阶子集不属于k-1频繁集,那么Y就不可能是频繁集,应该从候选集中裁剪掉。Apriori算法就是利用了频繁集的这个性质。

三、算法步骤:

首先是测试数据:交易ID商品ID列表

T100I1,I2,I5

T200I2,I4

T300I2,I3

T400I1,I2,I4

T500I1,I3

T600I2,I3

T700I1,I3

T800I1,I2,I3,I5

T900I1,I2,I3

算法的步骤图:

可以看到,第三轮的候选集发生了明显的缩小,这是为什么呢?

请注意取候选集的两个条件:

1.两个K项集能够连接的两个条件是,它们有K-1项是相同的。所以,(I2,I4)和(I3,I5)这种是不能够进行连接的。缩小了候选集。

2.如果一个项集是频繁集,那么它不存在不是子集的频繁集。比如(I1,I2)和(I1,I4)得到(I1,I2,I4),而(I1,I2,I4)存在子集(I1,I4)不是频繁集。缩小了候选集。

第三轮得到的2个候选集,正好支持度等于最小支持度。所以,都算入频繁集。

这时再看第四轮的候选集与频繁集结果为空

可以看到,候选集和频繁集居然为空了!因为通过第三轮得到的频繁集自连接得到{I1,I2,I3,I5},它拥有子集{I2,I3,I5},而{I2,I3,I5}不是频繁集,不满足:频繁集的子集也是频繁集这一条件,所以被剪枝剪掉了。所以整个算法终止,取最后一次计算得到的频繁集作为最终的频繁集结果:

也就是:['I1,I2,I3', 'I1,I2,I5']

四、代码:

编写Python代码实现Apriori算法。代码需要注意如下两点:由于Apriori算法假定项集中的项是按字典序排序的,而集合本身是无序的,所以我们在必要时需要进行set和list的转换;

由于要使用字典(support_data)记录项集的支持度,需要用项集作为key,而可变集合无法作为字典的key,因此在合适时机应将项集转为固定集合frozenset。def local_data(file_path): import pandas as pd

dt = pd.read_excel(file_path)

data = dt['con']

locdata = [] for i in data:

locdata.append(str(i).split(",")) # print(locdata) # change to [[1,2,3],[1,2,3]]

length = [] for i in locdata:

length.append(len(i)) # 计算长度并存储

# print(length)

ki = length[length.index(max(length))] # print(length[length.index(max(length))]) # length.index(max(length)读取最大值的位置,然后再定位取出最大值

return locdata,kidef create_C1(data_set): """

Create frequent candidate 1-itemset C1 by scaning data set.

Args:

data_set: A list of transactions. Each transaction contains several items.

Returns:

C1: A set which contains all frequent candidate 1-itemsets """

C1 = set() for t in data_set: for item in t:

item_set = frozenset([item])

C1.add(item_set) return C1def is_apriori(Ck_item, Lksub1): """

Judge whether a frequent candidate k-itemset satisfy Apriori property.

Args:

Ck_item: a frequent candidate k-itemset in Ck which contains all frequent

candidate k-itemsets.

Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.

Returns:

True: satisfying Apriori property.

False: Not satisfying Apriori property. """

for item in Ck_item:

sub_Ck = Ck_item - frozenset([item]) if sub_Ck not in Lksub1: return False return Truedef create_Ck(Lksub1, k): """

Create Ck, a set which contains all all frequent candidate k-itemsets

by Lk-1's own connection operation.

Args:

Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.

k: the item number of a frequent itemset.

Return:

Ck: a set which contains all all frequent candidate k-itemsets. """

Ck = set()

len_Lksub1 = len(Lksub1)

list_Lksub1 = list(Lksub1) for i in range(len_Lksub1): for j in range(1, len_Lksub1):

l1 = list(list_Lksub1[i])

l2 = list(list_Lksub1[j])

l1.sort()

l2.sort() if l1[0:k-2] == l2[0:k-2]:

Ck_item = list_Lksub1[i] | list_Lksub1[j] # pruning

if is_apriori(Ck_item, Lksub1):

Ck.add(Ck_item) return Ckdef generate_Lk_by_Ck(data_set, Ck, min_support, support_data): """

Generate Lk by executing a delete policy from Ck.

Args:

data_set: A list of transactions. Each transaction contains several items.

Ck: A set which contains all all frequent candidate k-itemsets.

min_support: The minimum support.

support_data: A dictionary. The key is frequent itemset and the value is support.

Returns:

Lk: A set which contains all all frequent k-itemsets. """

Lk = set()

item_count = {} for t in data_set: for item in Ck: if item.issubset(t): if item not in item_count:

item_count[item] = 1 else:

item_count[item] += 1

t_num = float(len(data_set)) for item in item_count: if (item_count[item] / t_num) >= min_support:

Lk.add(item)

support_data[item] = item_count[item] / t_num return Lkdef generate_L(data_set, k, min_support): """

Generate all frequent itemsets.

Args:

data_set: A list of transactions. Each transaction contains several items.

k: Maximum number of items for all frequent itemsets.

min_support: The minimum support.

Returns:

L: The list of Lk.

support_data: A dictionary. The key is frequent itemset and the value is support. """

support_data = {}

C1 = create_C1(data_set)

L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)

Lksub1 = L1.copy()

L = []

L.append(Lksub1) for i in range(2, k+1):

Ci = create_Ck(Lksub1, i)

Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)

Lksub1 = Li.copy()

L.append(Lksub1) return L, support_datadef generate_big_rules(L, support_data, min_conf): """

Generate big rules from frequent itemsets.

Args:

L: The list of Lk.

support_data: A dictionary. The key is frequent itemset and the value is support.

min_conf: Minimal confidence.

Returns:

big_rule_list: A list which contains all big rules. Each big rule is represented

as a 3-tuple. """

big_rule_list = []

sub_set_list = [] for i in range(0, len(L)): for freq_set in L[i]: for sub_set in sub_set_list: if sub_set.issubset(freq_set):

conf = support_data[freq_set] / support_data[freq_set - sub_set]

big_rule = (freq_set - sub_set, sub_set, conf) if conf >= min_conf and big_rule not in big_rule_list: # print freq_set-sub_set, " => ", sub_set, "conf: ", conf big_rule_list.append(big_rule)

sub_set_list.append(freq_set) return big_rule_listif __name__ == "__main__": """

Test """

file_path = "test_aa.xlsx"

data_set,k = local_data(file_path)

L, support_data = generate_L(data_set, k, min_support=0.2)

big_rules_list = generate_big_rules(L, support_data, min_conf=0.4) print(L) for Lk in L: if len(list(Lk)) == 0: break

print("="*50) print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport") print("="*50) for freq_set in Lk: print(freq_set, support_data[freq_set]) print() print("Big Rules") for item in big_rules_list: print(item[0], "=>", item[1], "conf: ", item[2])

文件格式:

test_aa.xlsxname con

T1 2,3,5T2 1,2,4T3 3,5T5 2,3,4T6 2,3,5T7 1,2,4T8 3,5T9 2,3,4T10 1,2,3,4,5

php关联规则,如何理解关联规则apriori算法相关推荐

  1. 关联规则(一)Apriori算法

    此篇文章转自 http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html 个人觉得比课本上讲的更通俗易懂! 1.  挖掘关联规则 1.1   什么是关联规 ...

  2. 关联规则—频繁项集Apriori算法

    转载地址:http://liyonghui160com.iteye.com/blog/2080531 一.前言 频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关 ...

  3. 【机器学习算法】关联规则-1 关联规则的概念,Apriori算法,实例和优缺点

    目录 关联规则 关联规则的概念: 关联规则的评估指标 -评估指标也就是支持度和置信度 APriori算法 Apriori的步骤 Apriori算法的实例说明 Apriori算法的实例的缺点及瓶颈 小结 ...

  4. 关联规则R语言实战(Apriori算法)

    最近遇到一个业务问题需要用关联规则的算法来实现,为了解决业务问题,我又重新复习了一遍以前就学过的Apriori算法并将其运用到业务场景中.下面,我想谈一谈在在具体的业务实现过程中我的一些感想. 一.理 ...

  5. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  6. 关联规则—Apriori算法—FPTree

    文章目录 一.关联规则 1.1 概念 1.2 示例 二.关联规则挖掘推论(Apriori 算法) 2.1 关联规则挖掘方法: 2.3 FP-growth 三.FP-growth原理 3.1 生成项头表 ...

  7. 利用weka进行数据挖掘——基于Apriori算法的关联规则挖掘实例

    文章目录 1. weka安装 2. 先分析一个Apriori算法的关联规则挖掘实例 3. 利用weka进行数据挖掘 3.1 将数据转为ARFF格式 3.2 利用weka进行分析 4. 参考文章 首先, ...

  8. Apriori算法简介---关联规则的频繁项集算法

    由啤酒和尿布引出: 在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的商品居然摆在一起.但这一奇怪的举措居然使尿布和啤酒的稍量大幅增加了.这可不是一个笑话,而是一直被商家所津津 ...

  9. 数据挖掘|关联规则Apriori算法详解及其在中医医案中的应用

    本文简单介绍传统数据挖掘关联规则算法中的Apriori算法,以及在挖掘中医医案辨证规律中的应用.并简单分析传统算法缺点,提出简要的改进思路. 文章目录 一.关联规则简介 二.Apriori算法简介 三 ...

最新文章

  1. hung-yi lee_p3_线性回归
  2. java后端 返回json_Java后端返回Json数据
  3. 用linux下常用命令wget进行整站下载(递归下载至本地)
  4. python怎么检查数据库实例能否链接_python pymysql链接数据库查询结果转为Dataframe实例...
  5. mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  6. scrollView的几个属性contentSize contentOffset contentInset
  7. JS----Ajax中XMLHttpRequest常用方法及属性
  8. 中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名
  9. 「BZOJ2654」tree
  10. opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
  11. java 数组 concat_JavaScript concat() 方法
  12. 从图书馆进入网络刷题练习与考试平台
  13. 不加好友实现QQ在线代码状态临时会话
  14. linux 终端命令字体大小,如何实现更改Linux终端字体的种类和大小
  15. 我深夜用 Python 跑神经网络,只为关掉台灯!
  16. Kienct与Arduino学习笔记(1) 基础知识之Arduino’Kinect‘Processing
  17. cesium 设置时间_Cesium 车辆跟踪事件气泡弹窗一直开启
  18. 用matlab求二重积分例题_数学建模matlab例题参考及练习
  19. Docker学习——pinpoint部署
  20. latex中文编号是问号的问题

热门文章

  1. 我是这样看搜狗搜索与知乎合作的
  2. 正则表达式匹配电话号码
  3. Linux:bc计算根号保留小数
  4. 上海亚商投顾:沪指逼近3300点 电力、光伏持续强势
  5. 判断一个序列是否可由给定序列通过栈操作获得
  6. 如何破解Amazon 登陆 metadata1值?Amazon 登陆 metadata1 形成的主要混淆的js研究
  7. 【转载】采购订单中的容差
  8. 支付宝小程序模板开发,一整套流程
  9. java 调用matlab rank_科学网—Matlab: X is rank deficient - 李旭的博文
  10. 游戏美术职业解读:原画,3D建模,3D动作,次世代