使用网上Python算法(Apriori算法和FPGrowth算法),实现关联结果
一、Apriori算法和FPGrowth算法 - 对比综述
Aprori算法利用频繁集的两个特性(最小支持度和最小置信度),过滤了很多无关的数据集,提高效率。但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。
FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高【4】。
二、Apriori算法
1. 概述
Apriori算法和FPGrowth算法的主要作业就是:利用一些有趣性的量度来识别数据库中发现的强规则【3】。在维基百科中对关联性学习词条信息中有这么一个举例:{洋葱, 土豆}→{汉堡} ,在解释合理性的角度很好理解,洋葱和土豆是汉堡制作必须的食材,此类信息可以作为做出促销定价或产品植入等营销活动决定的根据。(还有著名的【啤酒尿布】案例)。
2. 应用领域
除了上面购物篮分析中的例子以外,关联规则如今还被用在许多应用领域中,包括网络用法挖掘、入侵检测、连续生产及生物信息学中。与序列挖掘相比,关联规则学习通常不考虑在事务中、或事务间的项目的顺序。
3. Apriori概念
关联分析,主要是通过算法在大规模数据集中寻找频繁项集和关联规则。
- 支持度:支持度用来寻找频繁项集,频繁项集在全体数据样本中所占的比例;
- 置信度:置信度用来确定关联规则,体现为一个数据出现后,另一个数据出现的概率,或者说数据的条件概率;
用一个简单的例子说明。下表是顾客购买记录的数据库D,包含6个事务。项集 I = {网球拍,网球,运动鞋,羽毛球}。考虑关联规则:网球拍==>网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,故,
- 支持度 support = 3/6 = 0.5
- 置信度 confident= 3/5 =0.6
若给定最小支持度alpha =0.5,最小置信度beta =0.6,关联规则网球拍==>网球是有趣的,认为购买网球拍和购买网球之间存在强关联。
TID | 网球拍 | 网球 | 运动鞋 | 羽毛球 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
2 | 1 | 1 | 0 | 0 |
3 | 1 | 0 | 0 | 0 |
4 | 1 | 0 | 1 | 0 |
5 | 0 | 1 | 1 | 1 |
6 | 1 | 1 | 0 | 0 |
4. Apriori原理
如果某个项集是频繁的,那么它的所有子集也是频繁的。反过来,如果一个项集是非频繁集,那么它的所有超集(包含该非频繁集的父集)也是非频繁的。
根据Apriori原理,我们使用上述例子假设项集{网球拍,羽毛球}是非频繁的,那么它的所有超集,也都是非频繁的,即子集含有{网球拍,羽毛球}的集合。
在实际计算过程中,一旦计算出{网球拍,羽毛球}的支持度不满足最小支持度,那么就不需要再计算{网球,网球拍,羽毛球}、{运动鞋,网球拍,羽毛球}和{网球,运动鞋,网球拍,羽毛球}的支持度,因为它们也都是非频繁集。
5. Python代码实现Aprirori算法
# -*- coding: utf-8 -*-
# @Time : 2020/4/24
# @Author : li
# @FileName: demo002.py
# @Desc : Apriori算法实现(关联规则)
# 源码来源:http://www.imooc.com/article/266009
"""
Created on Fri Nov 30 16:38:01 2018
@author: lxh
"""
# 加载数据
def loadDataSet():
# 1,2等数字分别代表商品1,商品2等
# 额外举例:['网球拍', '网球', '运动鞋', '羽毛球']
goodList = [
['网球拍', '网球', '运动鞋'],
['网球拍', '网球'],
['网球拍'],
['运动鞋'],
['网球', '运动鞋', '羽毛球'],
['网球拍', '网球']
]
# return [[1, 2, 3], [1, 2], [1], [3], [2, 3, 4], [1, 2]]
return goodList
# 发现频繁项集
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort(