使用Apriori算法进行关联分析
Apriori原理
如果某个项集是频繁的,那么它的所有子集也是频繁的。即如果{0,1}是频繁的,则{0},{1}也是频繁的。
这个原理直观上并没有什么帮助,但如果反过来看,就有用了。
如果某个项集是非频繁的,那么它的所有超集也是非频繁的。即如果{0}也是非频繁的,则包含{0}的所有超集如{0,1}也是非频繁的。
重要定义
# 测试项集:
[['豆奶','莴苣'],
['莴苣','尿布','葡萄酒','甜菜'],
['豆奶','尿布','葡萄酒','橙汁'],
['莴苣','豆奶','尿布','葡萄酒'],
['莴苣','豆奶','尿布','橙汁']]
- 支持度(support)
一个项集的支持度,被定为为数据集中包含该项集的记录所占的比例,例如上面的测试数据,{豆奶}的支持度为4/5,而在5条记录中,有3条包含{豆奶,尿布},因此{豆奶,尿布}的支持度为3/5。支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小支持度的项集。
- 可信度或置信度(confidence)
置信度是针对一条诸如{尿布}→{葡萄酒}的关联规则来定义的。这条规则的可信度被定义为“支持度({尿布,葡萄酒})/支持度({尿布})”。上例中,由于{尿布,葡萄酒}的支持度为3/5,{尿布}的支持度为4/5,所以“尿布→葡萄酒”的可信度为3/4=0.75。
python实现
安装对应库
打开命令行窗口,输入
pip install apyori
若失败,可使用其他方法。
测试安装:
from apyori import apriori
导入成功,则安装成功,否则失败。
API
from apyori import apriori
data = [['豆奶','莴苣'],
['莴苣','尿布','葡萄酒','甜菜'],
['豆奶','尿布','葡萄酒','橙汁'],
['莴苣','豆奶','尿布','葡萄酒'],
['莴苣','豆奶','尿布','橙汁']]
result = list(apriori(transactions=data)
# apriori其他参数说明:
min_support -- The minimum support of relations (float).最小支持度,可用来筛选项集
min_confidence -- The minimum confidence of relations (float).最小可信度,可用来筛选项集
min_lift -- The minimum lift of relations (float).未知
max_length -- The maximum length of the relation (integer).未知
上面得到的result
是一个列表,由于没找到相关的文档,下面是我所能理解的元素的属性介绍。
result里每一个项集的属性介绍
- items – 项集,frozenset对象,可迭代取出子集。
- support – 支持度,float类型。
- confidence – 置信度或可信度, float类型。
- ordered_statistics – 存在的关联规则
可迭代,迭代后,其元素的属性:
- items_base – 关联规则中的分母项集
- confidence – 上面的分母规则所对应的关联规则的可信度
结尾
好了,简单的笔记就写到这。虽然暂时没找到这个库对应的文档,但可以通过pycharm预览每个项集的属性。虽然不能直接得出关联规则排序,但不需要自己写算法来计算支持度,比自己写计算过程好多了。
注意
Apriori算法不适用于非重复项集数元素较多的案例,如果某商店的销售商品种类是N,则其所有子集的个数为2^N - 1,其运算量之大,可想而知,建议分析的商品种类<10种。