python3代码如下:(项目见https://github.com/yantijin/Lean_DataMining)
#coding = utf-8
import numpy
#from python_util import fileread
"""
程序所需部分:
创建初始的候选集
根据Lk产生Lk+1
计算每个候选集的支持度
计算置信度
generateCandidate(Lk):筛选掉不合适的
数据读取
"""
"""
创建初始的候选集
INPUT:
data_set:a list of list 存储交易的数据
OUTPUT:
C1:列表,每个元素为一个集合
"""
def createInitCandidates(data_set):
C1 = []
for data in data_set:
for item in data:
if [item] not in C1:
C1.append([item])
C1.sort()
return [frozenset(c) for c in C1]
"""
计算支持度
INPUT:
data_set:交易数据
candidate:候选项集合
OUTPUT:
"""
def calSupport(data_set, candidates):
# 首先将data_set转化为集合
support = {}
datas = [frozenset(data) for data in data_set]
for candidate in candidates:
tmp = 0
for data in datas:
if candidate.issubset(data):
tmp += 1
support[candidate] = tmp/len(data_set)
return support
"""
根据支持度来进行筛选掉小于最小支持度的
INPUT:
candidates:候选项集合
min_support:最小支持度
support:candidates对应的支持度
OUTPUT:
new_candidates:即为Lk
"""
def filterCandidates(candidates, min_support, support):
new_candidates = []
for candidate in candidates:
if support[candidate] >= min_support:
new_candidates.append(candidate)
new_candidates.sort()
return new_candidates
"""
GnenerateCandidates
INPUT:
Lk:a list consists of set
OUTPUT:
candidates:Ck+1
"""
def generateCandidates(Lk):
candidates = []
#找出当前候选项集的长度
k = len(Lk[0])
len_Lk = len(Lk)
#self_joining
for len_kl1 in range(len_Lk):
tmp1 = list(Lk[len_kl1])[: k - 1]
for len_kl2 in range(len_kl1+1, len_Lk):
tmp2 = list(Lk[len_kl2])[: k - 1]
if tmp1 == tmp2:
candidate = Lk[len_kl1].union(Lk[len_kl2])
candidates.append(candidate)
candidates.sort()
return candidates
"""
Apriori算法实现
INPUT:
data_set:数据集,a list consists of list
min_support:最小支持度
"""
def Apriori(data_set, min_support):
# 产生初始项集合
C1 = createInitCandidates(data_set)
support = calSupport(data_set, C1)
# 筛选掉小于最小支持度的
L1 = filterCandidates(C1, min_support, support)
L = [L1]
k = 2
while len(L[k-2]) > 0:
candidates = generateCandidates(L[k-2])
tmp_support = calSupport(data_set, candidates)
Lk = filterCandidates(candidates, min_support, tmp_support)
#support.append(tmp_support)
support.update(tmp_support)
L.append(Lk)
k += 1
return support, L
"""
还需要做的工作:
输出频繁项集中高于最低值的置信度 两个支持度相除
"""
def calConfidence(supportdata,set1,set2):
tmp1=[]
tmp2=[]
set2.update(set1)
for key in supportdata:
if (set1 == key):
tmp1 = supportdata[key]
if (set2 == key):
tmp2 = supportdata[key]
if tmp1 == [] or tmp2 == []:
print("小于最小支持度或不存在")
return 0
else:
confidence = tmp2/tmp1
return confidence
if __name__ == "__main__":
#pathname = input("请输入文件地址")
data_set = fileread("testInput.txt")
support, L = Apriori(data_set, 0.2)
print("所有项集的支持度为", support)
print("频繁项集为", L)
#print(len(support))
confidence = calConfidence(support, {1}, {2})
print(confidence)
其中testInput.txt的格式如下:
1 2 5
2 4
2 3
1 2 4
1 3
2 3
1 3
1 2 3 5
1 2 3
2 4 5
以下内容转载自https://blog.csdn.net/baimafujinji/article/details/53456931
在2006年12月召开的 IEEE 数据挖掘国际会议上(ICDM, International Conference on Data Mining),与会的各位专家选出了当时的十大数据挖掘算法( top 10 data mining algorithms ),可以参见文献【1】。本博客已经介绍过的位列十大算法之中的算法包括:
- [1] k-means算法(http://blog.csdn.net/baimafujinji/article/details/50570824)
- [2] 支持向量机SVM(http://blog.csdn.net/baimafujinji/article/details/49885481)
- [3] EM算法(http://blog.csdn.net/baimafujinji/article/details/50626088)
- [4] 朴素贝叶斯算法(http://blog.csdn.net/baimafujinji/article/details/50441927)
- [5] kkNN算法(http://blog.csdn.net/baimafujinji/article/details/6496222)
- [6] C4.5决策树算法(http://blog.csdn.net/baimafujinji/article/details/53239581)
- [7] CART算法(http://blog.csdn.net/baimafujinji/article/details/53269040)
Apriori算法是一种用于关联规则挖掘(Association rule mining)的代表性算法,它同样位居十大数据挖掘算法之列。关联规则挖掘是数据挖掘中的一个非常重要的研究方向,也是一个由来已久的话题,它的主要任务就是设法发现事物之间的内在联系。
欢迎关注白马负金羁的博客 http://blog.csdn.net/baimafujinji,为保证公式、图表得以正确显示,强烈建议你从该地址上查看原版博文。本博客主要关注方向包括:数字图像处理、算法设计与分析、数据结构、机器学习、数据挖掘、统计分析方法、自然语言处理。
引言:数据挖掘与机器学习
有时候,人们会对机器学习与数据挖掘这两个名词感到困惑。如果你翻开一本冠以机器学习之名的教科书,再同时翻开一本名叫数据挖掘的教材,你会发现二者之间有相当多重合的内容。比如机器学习中也会讲到决策树和支持向量机,而数据挖掘的书里也必然要在决策树和支持向量机上花费相当的篇幅。可见二者确有相当大的重合面,但如果细研究起来,二者也的确是各自不同的领域。
大体上看,数据挖掘可以视为数据库、机器学习和统计学三者的交叉。简单来说,对数据挖掘而言,数据库提供了数据管理技术,而机器学习和统计学则提供了数据分析技术。所以你可以认为数据挖掘包含了机器学习,或者说机器学习是数据挖掘的弹药库中一类相当庞大的弹药集。既然是一类弹药,其实也就是在说数据挖掘中肯定还有其他非机器学习范畴的技术存在。Apriori算法就属于一种非机器学习的数据挖掘技术。
我们都知道数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。 而机器学习是以数据为基础,设法构建或训练出一个模型,进而利用这个模型来实现数据分析的一类技术。这个被训练出来的机器学习模型当然也可以认为是我们从数据中挖掘出来的那些潜在的、有意义的信息和知识。在非机器学习的数据挖掘技术中,我们并不会去建立这样一个模型,而是直接从原数据集入手,设法分析出隐匿在数据背后的某些信息或知识。在后续介绍Apriori算法时,你会相当明显地感受到这一特点。
基本概念
许多商业企业在日复一日的运营中积聚了大量的交易数据。例如,超市的收银台每天都收集大量的顾客购物数据。例如,下表给出了一个这种数据集的例子,我们通常称其为购物篮交易(market basket transaction)。表中每一行对应一个交易,包含一个唯一标识TID和特定顾客购买的商品集合。零售商对分析这些数据很感兴趣,以便了解其顾客的购买行为。可以使用这种有价值的信息来支持各种商业中的实际应用,如市场促销,库存管理和顾客关系管理等等。
令I={i1,i2,⋯,id}I={i1,i2,⋯,id}是购物篮数据中所有项的集合,而T={t1,t2,⋯,tN}T={t1,t2,⋯,tN}是所有交易的集合。包含0个或多个项的集合被称为项集(itemset)。如果一个项集包含kk个项,则称它为 kk-项集。显然,每个交易titi包含的项集都是II的子集。
关联规则是形如 X→YX→Y 的蕴涵表达式,其中XX和YY是不相交的项集,即 X∩Y=∅X∩Y=∅。关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。支持度确定规则可以用于给定数据集的频繁程度,而置信度确定YY在包含XX的交易中出现的频繁程度。支持度(ss:Fraction of transactions that contain both XX and YY)和置信度(cc:How often items in YY appear in transactions that contain XX)这两种度量的形式定义如下:
s(X→Y)=σ(X∪Y)Nc(X→Y)=σ(X∪Y)σ(X)s(X→Y)=σ(X∪Y)Nc(X→Y)=σ(X∪Y)σ(X)
例如考虑规则{Milk, Diaper}→→{Beer},则易得:
s=σ(Milk,Diaper,Beer)|T|=25=0.4c=σ(Milk,Diaper,Beer)σ(Milk,Diaper)=23=0.67s=σ(Milk,Diaper,Beer)|T|=25=0.4c=σ(Milk,Diaper,Beer)σ(Milk,Diaper)=23=0.67
Association Rule Mining Task:Given a set of transactions T, the goal of association rule mining is to find all rules having
- support ≥ minsup threshold
- confidence ≥ minconf threshold
因此,大多数关联规则挖掘算法通常采用的一种策略是,将关联规则挖掘任务分解为如下两个主要的子任务。
- 频繁项集产生:其目标是发现满足最小支持度阈值的所有项集,这些项集称作频繁项集(frequent itemset)。
- 规则的产生:其目标是从上一步发现的频繁项集中提取所有高置信度的规则,这些规则称作强规则(strong rule)。
通常,频繁项集产生所需的计算开销远大于产生规则所需的计算开销。
最容易想到、也最直接的进行关联关系挖掘的方法或许就是暴力搜索(Brute-force)的方法:
- List all possible association rules
- Compute the support and confidence for each rule
- Prune rules that fail the minsup and minconf thresholds
然而,由于Brute-force的计算量过大,所以采样这种方法并不现实!格结构(Lattice structure)常被用来枚举所有可能的项集。如下图所示为I={a,b,c,d,e}I={a,b,c,d,e}的项集格。一般来说,排除空集后,一个包含kk个项的数据集可能产生2k−12k−1个频繁项集。由于在实际应用中kk的值可能非常大,需要探查的项集搜索空集可能是指数规模的。
发现频繁项集的一种原始方法是确定格结构中每个候选项集(candidate itemset)的支持度计 数。为了完成这一任务,必须将每个候选项集与每个交易进行比较,如下图所示。如果候选项集包含在交易中,则候选项集的支持度计数增加。例如,由于项集{Bread, Milk}出现在事务1、4 和5中,其支持度计数将增加3次。这种方法的开销可能非常大,因为它需要进行O(NMw)O(NMw)次比 较,其中NN是交易数,M=2k−1M=2k−1是候选项集数,而ww是交易的最大宽度(也就是交易中最大的项数)。
先验原理
在上一小节的末尾,我们已经看到Brute-force在实际中并不可取。我们必须设法降低产生频繁项集的计算复杂度。此时我们可以利用支持度对候选项集进行剪枝,这也是Apriori所利用的第一条先验原理:
Apriori定律1:如果一个集合是频繁项集,则它的所有子集都是频繁项集。
例如:假设一个集合{A,B}是频繁项集,即A、B同时出现在一条记录的次数大于等于最小支持度min_support,则它的子集{A},{B}出现次数必定大于等于min_support,即它的子集都是频繁项集。
Apriori定律2:如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。
举例:假设集合{A}不是频繁项集,即A出现的次数小于 min_support,则它的任何超集如{A,B}出现的次数必定小于min_support,因此其超集必定也不是频繁项集。
下图表示当我们发现{A,B}是非频繁集时,就代表所有包含它的超级也是非频繁的,即可以将它们都剪除。
Apriori算法与实例
R. Agrawal 和 R. Srikant于1994年在文献【2】中提出了Apriori算法,该算法的描述如下:
- Let kk=1
- Generate frequent itemsets of length kk
- Repeat until no new frequent itemsets are identified
- Generate length (kk+1) candidate itemsets from length kk frequent itemsets
- Prune candidate itemsets containing subsets of length kk+1 that are infrequent
- Count the support of each candidate by scanning the DB
- Eliminate candidates that are infrequent, leaving only those that are frequent
或者在其他资料上更为常见的是下面这种形式化的描述(注意这跟前面的文字描述是一致的):
下面是一个具体的例子,最开始数据库里有4条交易,{A、C、D},{B、C、E},{A、B、C、E},{B、E},使用min_support=2作为支持度阈值,最后我们筛选出来的频繁集为{B、C、E}。
上述例子中,最值得我们从L2L2到C3C3的这一步。这其实就是在执行伪代码中第一个蓝色框条所标注的地方:Ck+1=GenerateCandidates(Lk)Ck+1=GenerateCandidates(Lk),具体来说在Apriori算法中,它所使用的策略如下:
可见生成策略由两部分组成,首先是self-joining部分。例如,假设我们有一个L3L3={abc, abd, acd, ace, bcd}(注意这已经是排好序的}。选择两个itemsets,它们满足条件:前kk-1个item都相同,但最后一个item不同,把它们组成一个新的Ck+1Ck+1的项集cc。如下图所示,{abc}和{abd}组成{abcd},{acd}和{ace}组成{acde}。生成策略的第二部分是pruning。对于一个位于Ck+1Ck+1中的项集cc,ss是cc的大小为kk的子集,如果ss不存在于LkLk中,则将cc从Ck+1Ck+1中删除。如下图所示,因为{acde}的子集{cde}并不存在于L3L3中,所以我们将{acde}从C4C4中删除。最后得到的C4C4,仅包含一个项集{abcd}。
回到之前的例子,从L2L2到C3C3的这一步,我们就只能获得{B、C、E}。以上便是Apriori算法的最核心思想。当然在具体实现的时候,如何Count Supports of Candidates也是需要考虑的问题,我们这里略去这部分内容的讨论,有兴趣读者可以参阅文献【3】以了解更多。
参考文献
【1】Wu, X., Kumar, V., Quinlan, J.R., Ghosh, J., Yang, Q., Motoda, H., McLachlan, G.J., Ng, A., Liu, B., Philip, S.Y. and Zhou, Z.H., 2008. Top 10 algorithms in data mining. Knowledge and information systems, 14(1), pp.1-37. (http://www.cs.uvm.edu/~icdm/algorithms/10Algorithms-08.pdf)
【2】Rakesh Agrawal and Ramakrishnan Srikant Fast algorithms for mining association rules in large databases. Proceedings of the 20th International Conference on Very Large Data Bases, VLDB, pages 487-499, Santiago, Chile, September 1994. (http://rakesh.agrawal-family.com/papers/vldb94apriori.pdf)
【3】Pang-Ning Tan, Micheale Steinbach, Vipin Kumar. 数据挖掘导论,范明,等译. 人民邮电出版社,2011