机器学习经典算法10-Apriori
来源:互联网 发布:淘宝主板为什么要交换 编辑:程序博客网 时间:2024/05/16 17:55
1.关联分析
通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为。这种从大量数据中抽取的知识可用于商品定价、市场促销、存货管理等环节。所谓关联,反映的是一个事物和其他事物之间依赖或关联的知识。从大规模数据集中寻找事物间的隐含关系称为关联分析(association analysis)或者关联规则学习(association rule mining)。
在关联分析中,事物之间的关系较为常用的有两种:频繁项集和关联规则。频繁项集(frequent item sets)是经常出现在一起的物品集合,关联规则(association rules)则暗示两个物品之间可能存在很强关系。
在关联分析中,事物之间的关系较为常用的有两种:频繁项集和关联规则。频繁项集(frequent item sets)是经常出现在一起的物品集合,关联规则(association rules)则暗示两个物品之间可能存在很强关系。
2.基本定义
3.Apriori
对于频繁项集挖掘的任务,可以使用暴力求解方法,没每个可能的项集进行support计算,然后通过minSupport进行过滤,但是这样过于费时。
Apriori原理中,如果某个项集是频繁的,则其所有子集也是频繁的。反过来说,也就是说某个项集是非频繁的,那么其所有超集也是非频繁的。所以在进行频繁项集挖掘时,从1-项集开始,基于minSupport进行过滤,对过滤后的项集进行排列组合,形成2-项集,然后基于minSupport进行过滤,这样以此下去,一直到形成的k-项集中只有1个元素为止。
Apriori原理中,如果某个项集是频繁的,则其所有子集也是频繁的。反过来说,也就是说某个项集是非频繁的,那么其所有超集也是非频繁的。所以在进行频繁项集挖掘时,从1-项集开始,基于minSupport进行过滤,对过滤后的项集进行排列组合,形成2-项集,然后基于minSupport进行过滤,这样以此下去,一直到形成的k-项集中只有1个元素为止。
4.实现示例
aprioriGen用于产生新的候选集合列表,这里用了一个技巧,即(根据Apriori原则)需要对k-1的频繁项集进行排列组合生成Ck,在进行排列组合的时候,用两个for循环,如果两个元素(元素内部是有序的)的[0,k-2)个元素相同则进行合并,避免计算量过大;函数scanD用于统计候选集合列表Ck中各个项集的频率,并基于minSupport进行过滤;在进行generateRules时,即产生关联规则,根据Apriori原理,右边显示单个项集,然后慢慢增加。
其他说明:python字典的update函数可以将两个字典进行合并,具体合并规则还请自行查阅;选择list的一部分[:k],当k等于0的时候,获得是[];python中对set支持|操作,即计算并集。
其他说明:python字典的update函数可以将两个字典进行合并,具体合并规则还请自行查阅;选择list的一部分[:k],当k等于0的时候,获得是[];python中对set支持|操作,即计算并集。
from numpy import *import matplotlib.pyplot as pltdef loadDataSet(): return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]def createC1(dataSet): C1=[] for transaction in dataSet: for item in transaction: if [item] not in C1: C1.append([item]) C1.sort() return map(frozenset,C1)def scanD(D, Ck, minSupport): ssCnt={} for tid in D: for can in Ck: if can.issubset(tid): if not ssCnt.has_key(can): ssCnt[can]=1 else: ssCnt[can]+=1 numItems = float(len(D)) retList=[] supportData={} for key in ssCnt: support = ssCnt[key]/numItems if support>=minSupport: retList.insert(0,key) supportData[key]=support return retList, supportDatadef aprioriGen(Lk,k): retList=[] lenLk=len(Lk) for i in range(lenLk): for j in range(i+1,lenLk): L1=list(Lk[i])[:k-2] L2=list(Lk[j])[:k-2] L1.sort() L2.sort() if L1==L2: retList.append(Lk[i] | Lk[j]) return retListdef apriori(dataSet, minSupport=0.5): C1=createC1(dataSet) D=map(set, dataSet) L1, supportData=scanD(D, C1, minSupport) L=[L1] k=2 while len(L[k-2])>0: Ck=aprioriGen(L[k-2],k) Lk, supK=scanD(D, Ck, minSupport) supportData.update(supK) L.append(Lk) k+=1 return L, supportDatadef generateRules(L, supportData, minConf=0.7): bigRuleList=[] for i in range(1,len(L)): for freqSet in L[i]: H1=[frozenset([item]) for item in freqSet] if(i>1): rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf) else: calcConf(freqSet, H1, supportData, bigRuleList, minConf) return bigRuleListdef calcConf(freqSet, H, supportData, br1, minConf=0.7): prunedH=[] for conseq in H: conf = supportData[freqSet]/supportData[freqSet-conseq] if conf>minConf: print freqSet-conseq, "-->", conseq,'conf:',conf br1.append((freqSet-conseq, conseq, conf)) prunedH.append(conseq) return prunedHdef rulesFromConseq(freqSet, H, supportData, br1, minConf=0.7): m=len(H[0]) if(len(freqSet)>m+1): Hmp1=aprioriGen(H,m+1) Hmp1=calcConf(freqSet, Hmp1, supportData, br1, minConf) if(len(Hmp1)>1): rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)dataSet=loadDataSet()L, supportData = apriori(dataSet)print Lprint supportDatarules=generateRules(L, supportData,0.5)
- 机器学习经典算法10-Apriori
- 机器学习--Apriori算法
- 【机器学习算法】之Apriori
- 机器学习实战学习笔记10——Apriori算法
- 机器学习算法(九):Apriori算法
- 机器学习(八)Apriori算法学习
- 机器学习(八)Apriori算法学习
- 机器学习实战笔记9(Apriori算法)
- 机器学习实战笔记9(Apriori算法)
- 机器学习算法-Apriori关联分析
- 机器学习(十):Apriori算法
- 【机器学习】关联规则与Apriori算法
- 十大机器学习算法之Apriori
- 机器学习(二)Apriori算法
- 【R的机器学习】Apriori算法
- 简单易学的机器学习算法——Apriori算法
- 简单易学的机器学习算法——Apriori算法
- 机器学习实战--apriori
- 项目估算与计划不是一般的难!(4)——计划有什么内容?
- PrintWriter返回乱码的分析及解决
- HDU 1573 X问题 (非互质情况下的中国剩余定理)
- 某公司数据库面试题
- Mac下不能读写移动硬盘问题解决
- 机器学习经典算法10-Apriori
- ZOJ 2797 最短路
- FFT(快速傅立叶算法 for java)
- uvc摄像头代码解析3
- 如何使用多个Spring的xml配置文件(多模块配置)
- presentModalViewController和dismissModalViewControllerAnimated的使用总结
- hdu2197 本源串
- 在Oracle数据库实现自动断开空闲连接
- java 接口的 实例化