python 频繁项集_Apriori算法:从数据中挖掘频繁项集
简介
Apriori是一种流行的算法,用于在关联规则学习中提取频繁项集。Apriori算法被设计用于对包含交易的数据库进行操作,例如商店客户的购买。如果项目集满足用户指定的支持阈值,则该项目集被视为“频繁”。例如,如果支持度阈值设置为0.5(50%),则频繁项目集被定义为在数据库中所有事务的至少50%中一起发生的项目集合。
定义
支持度(support):support(A=>B) = P(A∪B),表示A和B同时出现的概率。
置信度(confidence):confidence(A=>B)=support(A∪B) / support(A),表示A和B同时出现的概率占A出现概率的比值。
频繁项集:在项集中频繁出现并满足最小支持度阈值的集合,例如{牛奶,面包}、{手机,手机壳}等。
强关联规则:满足最小支持度和最小至此年度的关联规则。
算法步骤
从记录中计算所有的候选1项集,并计算频繁1项集及支持度。
由频繁1项集生成k项候选集,并由k项候选集计算k项频繁集。
用k项频繁集生成所有关联规则,计算生成规则置信度,筛选符合最小置信度的关联规则。
Apriori原理
任一频繁项的所有非空子集也必须是频繁的。也就是当生成k项候选集的时候,如果候选集中的元素不在k-1项频繁集中,则该元素一定不是频繁集,这个时候不需要计算支持度,直接去除即可。
比如说我们有0,1,2,3组成的集合,下面是其所有的项集组合:
从1项集开始计算k项集的支持度,在2项集候选集中当我们计算出{0,1}集合是非频繁的,那么它的所有子集都是非频繁的,即2项集{0,1,2}和{0,1,3}也是非频繁的,它们的子集{0,1,2,3}同样是非频繁的,对于非频繁集我们就不需要去计算支持度。
当找出所有的频繁后需要从频繁集中挖掘所有的关联规则,假设频繁项集{0,1,2,3},下图表示其生成的所有关联规则,对于阴影部分的低可信度的规则,它们的子集同样也会是低可信度的。
Python实现
网上一些Python实现Apriori算法实际上代码不太符合python风格,另外一点就是有点不好理解,所以这里尽可能简洁的实现。
1. 数据集
使用列表表示多个事务记录,每个事务记录同样使用列表表示项集。
data = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
2. 创建初始候选集
这里使用frozenset不可变集合是为了后续计算支持度字典是将集合作为键。
def apriori(data_set):
# 候选项1项集
c1 = set()
for items in data_set:
for item in items:
item_set = frozenset([item])
c1.add(item_set)
3. 从候选项集中选出频繁项集
如下图所以我们需要从初始的候选项集中计算k项频繁项集,所以这里封装函数用于每次计算频繁项集及支持度,当候选项集中集合中的每个元素都存在事务记录集合中是计数并保存到字典中,计算支持度后输出频繁项集和支持度。
def generate_freq_supports(data_set, item_set, min_support):
freq_set = set() # 保存频繁项集元素
item_count = {} # 保存元素频次,用于计算支持度
supports = {} # 保存支持度
# 如果项集中元素在数据集中则计数
for record in data_set:
for item in item_set:
if item.issubset(record):
if item not in item_count:
item_count[item] = 1
else:
item_count[item] += 1
data_len = float(len(data_set))
# 计算项集支持度
for item in item_count:
if (item_count[item] / data_len) >= min_support:
freq_set.add(item)
supports[item] = item_count[item] / data_len
return freq_set, supports
4.生成新组合
由初始候选集会生成{1,2,3,5}的频繁项集,后续需要生成新的候选项集Ck。
def generate_new_combinations(freq_set, k):
new_combinations = set() # 保存新组合
sets_len = len(freq_set) # 集合含有元素个数,用于遍历求得组合
freq_set_list = list(freq_set) # 集合转为列表用于索引
for i in range(sets_len):
for j in range(i + 1, sets_len):
l1 = list(freq_set_list[i])
l2 = list(freq_set_list[j])
l1.sort()
l2.sort()
# 项集若有相同的父集则合并项集
if l1[0:k-2] == l2[0:k-2]:
freq_item = freq_set_list[i] | freq_set_list[j]
new_combinations.add(freq_item)
return new_combinations
5.循环生成候选集集频繁集
def apriori(data_set, min_support, max_len=None):
max_items = 2 # 初始项集元素个数
freq_sets = [] # 保存所有频繁项集
supports = {} # 保存所有支持度
# 候选项1项集
c1 = set()
for items in data_set:
for item in items:
item_set = frozenset([item])
c1.add(item_set)
# 频繁项1项集及其支持度
l1, support1 = generate_freq_supports(data_set, c1, min_support)
freq_sets.append(l1)
supports.update(support1)
if max_len is None:
max_len = float('inf')
while max_items and max_items <= max_len:
ci = generate_new_combinations(freq_sets[-1], max_items) # 生成候选集
li, support = generate_freq_supports(data_set, ci, min_support) # 生成频繁项集和支持度
# 如果有频繁项集则进入下个循环
if li:
freq_sets.append(li)
supports.update(support)
max_items += 1
else:
max_items = 0
return freq_sets, supports
6.生成关联规则
def association_rules(freq_sets, supports, min_conf):
rules = []
max_len = len(freq_sets)
# 生成关联规则,筛选符合规则的频繁集计算置信度,满足最小置信度的关联规则添加到列表
for k in range(max_len - 1):
for freq_set in freq_sets[k]:
for sub_set in freq_sets[k + 1]:
if freq_set.issubset(sub_set):
conf = supports[sub_set] / supports[freq_set]
rule = (freq_set, sub_set - freq_set, conf)
if conf >= min_conf:
rules.append(rule)
return rules
7.主程序
if __name__ == '__main__':
data = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
L, support_data = apriori(data, min_support=0.5)
association_rules = association_rules(L, support_data, min_conf=0.7)
Mlxtend实现
Mlxtend是一个用于日常数据科学任务的Python库。
这个库是在搜索Apriori算法相关资料的时候,google给出的其中一个搜索结果,通过库的文档可以发现该库frequent_patterns模块实现Apriori算法和挖掘关联规则。感兴趣的话可以自行搜索相关文档,当然自己实现的话对整个算法的思路要更清晰一些。具体实现如下:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
data = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
frequent_itemsets = apriori(df, min_support=0.5, use_colnames=True)
rules = association_rules(frequent_itemsets, min_threshold=0.7)
通过TransactionEncoder将其转化为正确的数据格式,再使用apriori函数生成频繁项集,最后使用association_rules生成关联规则。可以看到编码后的数据实际上是特征矩阵,每个列对应的是项集元素。
df
frequent_itemsets
rules
python 频繁项集_Apriori算法:从数据中挖掘频繁项集相关推荐
- 使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件
使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件 因为有统计成员到会情况的任务,每次汇总时都很麻烦,需要一个个对应腾讯会议导出名单的成员,然后在总表上进行标 ...
- 论文浅尝 - WWW2020 | 通过对抗学习从用户—项目交互数据中挖掘隐含的实体偏好来用于知识图谱补全任务...
笔记整理 | 陈湘楠,浙江大学在读硕士. 现有的知识图谱补全方法都在试图设计全新的学习算法,来使用已知的事实信息去推理知识图谱中的潜在语义.但随着知识图谱的广泛使用,知识图谱中的许多实体对应着应用程序 ...
- 风控建模十二:数据淘金——如何从APP数据中挖掘出有效变量
风控建模十二:数据淘金--如何从APP数据中挖掘出有效变量 1.常识知识 2.个例分析 3.分布排查 智能手机的诞生改变了人类的生活方式,智能手机所承载的功能日臻完善.强大,人们在衣.食.住.行.工作 ...
- 我做了一个Python Bot,可以解决任何给定图像中的多项选择问题。 码]
在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统. 基本上,这种自动化可以从图片中找到多项选择题的答案. 一件事很清楚,在考试期间不可能在互联网上搜索问题,但是当考官转过头来时,我 ...
- python 微信bot_我做了一个Python Bot,可以解决任何给定图像中的多项选择问题。 码]...
python 微信bot 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统. 基本上,这种自动化可以从图片中找到多项选择题的答案. 一件事很清楚,在考试期间不可能在互联网上搜索问题 ...
- 如何从购物数据中挖掘出啤酒与尿布的关联关系?
首先说一个关联分析的经典案例,零售业巨头沃尔玛对消费者的购物行为进行分析时发现,男性顾客在购买婴儿尿布时,通常会顺带购买几瓶啤酒来犒劳自己,于是推出了尿布和啤酒摆在一起销售的促销手段.而这个举措真 ...
- JUST技术:从GPS数据中挖掘用户行为习惯
智能设备(如智能手机.互联可穿戴设备)的使用呈指数级的增长.据统计,80%的互联网用户拥有智能手机[1],而移动应用程序的使用每年以6%的速度增长,这创造了大量的信息,并带来了大量的研究和商业机会,如 ...
- Google大佬手把手教你从数据中挖掘价值:好产品是怎样炼成的
导读:设计师最关注的可能就是提供良好的用户体验.良好的业务指标应时时把用户考虑在内.当希望借助数据更好地了解用户时,面临的第一个问题是选择哪些用户进行数据收集. 通过高效的实验方法收集用户数据,将在用 ...
- 【问答集锦】从数据中挖掘宝藏,深度学习赋予机器更多“思想”
2020腾讯广告算法大赛专题直播周是由腾讯广告打造的一档大咖直播活动,特邀2020腾讯广告算法大赛的专家评委,针对联邦学习.机器学习.大数据等前沿领域的核心话题进行分享,并为算法爱好者们答疑解惑.我们 ...
最新文章
- Matlab编程与数据类型 -- 单元数组
- 测试驱动开发是否是一种强迫症?
- 猜数字游戏_FLEX版
- eBay测试老兵的修炼之道:如何从测试“小工”到测试“专家”?
- Spring 详解(三):AOP 面向切面的编程
- wordpress常用插件汇总
- 《去哪网编程题》filename extension
- MFC访问阿里云Oss平台
- MySql 学习笔记-Mysql架构介绍与查询sql执行流程
- 初识GDI、GDI+
- 图像处理基本概念、术语
- 鸟哥的 Linux 私房菜学习笔记
- miniui中的相关问题
- eclipse中出现代码覆盖的颜色信息,如何去掉
- (转)百度金融联合多方发布国内首单区块链证券化项目 发行规模超4亿
- 电脑IP地址查看及修改
- mysqldump参数之-A -B
- 合并多个集合同类项{aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}通过编程实现结果为:{aaa,bbb,ccc,ddd,hhh},{eee,fff},
- ih5长图如何滑动_iH5中级教程:微场景H5必备,横向滑动切换
- Python如何快速爬取淘宝MM呢?教你一招