关联挖掘和Aprioir算法

Apriori算法

  • 优点:易编码实现
  • 缺点:在大数据集上可能较慢
  • 适用数据类型:数值型或者标称型

算法过程:

关联分析是一种在大规模数据集中寻找有意思的关系的任务,这里的有意思的关系有两种:频繁项集(frequent item sets)或关联规则(association rules)。
支持度(support):一个项集的支持度被定义为数据集中该项集的记录所占的比例。
置信度(confidence):关联规则A->B的置信度表示为support(A,B)/support(A)

单纯暴力做的话有2^n-1个组合
Apriori原理:如果某个项集是频繁的那么它的子项集也是频繁的。
反过来看就是说一个项如果不是频繁项的话,那么包含他的项也不是频繁项

这里主要是两个过程:
1.生成频繁项集:

这是一个挺简单的过程就是两个集合C、L来回倒,C就是通过初选的集合(像是最原始的啊,组合出来的啊);L是通过支持度筛选的集合。过程大体如下:
1.根据原始数据集构建单个项组成的集合C1
2.根据C1计算L1
3.找出L1中可以的合并的得到C2
4.重复上述C2 -> L2 -> C3 ->.....->Ck -> Lk

2.推导出关联规则:

通过上一步得到的频繁项集,我们就只需要吧每个频繁项集里能够列出的规则都列出来,然后计算置信度,选出置信度符合要求的就可以了。

函数:

loadDataSet()
导入数据集,数据集包含多条list,每个list是一个项集
createC1(dataSet)
创建C1,提取出所有单个的项,这里用frozenset的原因是后面要用这个作为字典的key
scanD(D, Ck, minSupport)
过滤掉Ck中不符合最小支持度的,返回满足的Lk和最小支持度
apprioriGen(Lk, k)
将Lk合并得到Ck+1,这里通过只对前k-1个元素进行比较,可以减少遍历次数。比如合并{0,1},{0,2},{1,2}合并,只需要判断一次就行
apriori(dataSet, minsupport=0.5)
将上面的几个函数综合起来,完成整个过程。结束条件是不再能够产生新的项集
generateRules(L, supportData, minConf=0.7)
生成关联规则的主函数,这里要从包含两个项的频繁项集开始判断
calcConf(freqSet, H, supportData, brl, minConf=0.7)
对于给定的频繁项集freqSet和可以推断出来的H计算置信度,得到关联规则
rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7)
这里的不同是H可以变得更复杂,比如说现在有{1,2,3}-->{1}{2},这里我们希望将H进一步合并得到{1,2}从而更加充分的发掘关联规则。这是一个递归的过程知道无法再合并结束。

  1.  1 #coding=utf-8
    
     2 def loadDataSet():
    
     3     return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
    
     4 def creteC1(dataSet):
    
     5     C1 = []
    
     6     for transaction in dataSet:
    
     7         for item in transaction:
    
     8             if [item] not in C1:
    
     9                 C1.append([item])
    
    10     C1.sort()
    
    11     return map(frozenset,C1)
    
    12 def scanD(D, Ck, minSupport):
    
    13     ssCnt = {}
    
    14     for tid in D:
    
    15         for can in Ck:
    
    16             if can.issubset(tid):
    
    17                 if ssCnt.has_key(can):
    
    18                     ssCnt[can] += 1
    
    19                 else:
    
    20                     ssCnt[can] = 1
    
    21     numItems = float(len(D))
    
    22     retList = []
    
    23     supportData = {}
    
    24     for key in ssCnt:
    
    25         supprt = ssCnt[key] / numItems
    
    26         if supprt >= minSupport:
    
    27             retList.append(key)
    
    28         supportData[key] = supprt
    
    29     return retList,supportData 
    
    30 def appriGen(Lk,k):
    
    31     retList = []
    
    32     lenLk = len(Lk)
    
    33     for i in range(lenLk):
    
    34         for j in range(i+1, lenLk):
    
    35             L1 = list(Lk[i])[:k-2]#前k-1个
    
    36             L2 = list(Lk[i])[:k-2]
    
    37             L1.sort()
    
    38             L2.sort()
    
    39             if L1 == L2:
    
    40                 retList.append(Lk[i] | Lk[j])
    
    41     return retList
    
    42 def apriori(dataSet, minSupport=0.5):
    
    43     C1 = creteC1(dataSet)
    
    44     D = map(set, dataSet)
    
    45     L1, supportData = scanD(D,C1,minSupport=0.7)
    
    46     L = [L1]
    
    47     k=2
    
    48     while len(L[k-2]) > 0:
    
    49         Ck = appriGen(L[k-2], k)
    
    50         Lk, supK = scanD(D, Ck, minSupport)
    
    51         supportData.update(supK)
    
    52         L.append(Lk)
    
    53         k += 1
    
    54     return L,supportData
    
    55 def generateRules(L, supportData, minConf=0.7):
    
    56     bigRules = []
    
    57     for i in range(1,len(L)):#从包含两个的开始
    
    58         for freqSet in L[i]:
    
    59             H1 = [frozenset([item]) for item in freqSet]
    
    60             if (i>1):#频繁项集元素数目大于2
    
    61                 rulesFormConseq(freqSet,H1,supportData,bigRules,minConf)
    
    62             else:
    
    63                 calcConf(freqSet,H1,supportData,bigRules,minConf)
    
    64     return bigRules
    
    65 def calcConf(freqSet, H, supportData,brl,minConf=0.7):
    
    66     prunedH = []
    
    67     for conseq in H:
    
    68         conf = supportData[freqSet] / supportData[freqSet - conseq]
    
    69         print supportData[freqSet] , supportData[freqSet - conseq]
    
    70         if conf >= minConf:
    
    71             print freqSet-conseq,'-->',conseq,'conf',conf
    
    72             brl.append((freqSet-conseq,conseq,conf))
    
    73             prunedH.append(conseq)
    
    74     return prunedH
    
    75 def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):
    
    76     m = len(H[0])
    
    77     if len(freqSet) > m+1:
    
    78         Hmp1 = appriGen(H,m+1)
    
    79         Hmp1 = calcConf(freqSet,Hmp1,supportData,brl,minConf)
    
    80         if len(Hmp1)>1:
    
    81             rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)
    
    82 def main():
    
    83     dataSet = loadDataSet()
    
    84     L,supportData = apriori(dataSet, minSupport=0.7)
    
    85     print L
    
    86     rules = generateRules(L,supportData,minConf=0.7)
    
    87     print rules
    
    88     
    
    89 if __name__ == '__main__':
    
    90     main()

     

  2. 机器学习笔记索引

     



你可能感兴趣的:(apr)