Apriori算法及python代码实现

Apriori算法作用就是在一个数据集合中,找到满足出现次数大于等于一个阀值的子集及出现个数,这句话可能不是很好理解。举一个例子,比如说你是一家超市的店主,每天你的超市有大量的商品卖出,你想知道哪几样的商品,他们被一起买的次数很多,那么你可以改变超市商品摆放布局,让被一起买的商品放的位置近一些,这样可能能提高超市的销售额。那么假如现在有很多张顾客购买的清单,他们总共购买了n种商品,你想找出这n种商品中,被同时购买次数超过k的所有子集,Apriori算法就是解决这样的问题的。

在说这个算法的具体执行步骤前,我觉得可以先大概分析一下我们所要解决的问题,会发现,假如一个商品集合被购买次数少于k,那么所有包含这个商品集合的商品集合,肯定也是少于k的,所以,这启发我们,要从小到大开始解决这个问题,因为集合中商品种类越多,他被同时购买的可能性越小。

下面按我自己的理解描述和下Apriori算法的具体步骤:

1既然按照规模从小到大的思路,那么首先就是先找出规模为1的集合,这部需要遍历数据集中每一个数据,找出符合条件的结果加入到一个集合中,记为L(L1是一个集合,它的每个元素是规模为1的集合)。

2Li就是规模为i的所有解的集合,每次利用每次用Li生成Li+1,生成的方法就是用找到Li的任意两个元素(每个元素都是一个集合),如果这两个元素的前i-1个元素完全相同,那么这两个元素可以生成一个新的元素,这个新元素的前i-1个元素是就是这两个元素前i-1个元素的公共值,然后分别将两个第i个元素加上去即可,每次生成一个新的元素,就将其放到新的候选集合中,记为Ci+1。

3根据apriori的性质 ,Ci+1任意一个元素(是一个集合)的子集,它必须在前面L1,L2,,...Li出现过,否则直接删除掉这个元素,然后遍历整个数据集,判断是否满足最少次数大于等于k的条件,删去不符合条件的元素后的结果就是Li+1。

4回到2,假如Li为空时,算法停止。

附上python代码如下:

def creatDataSet():
    dataset= [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
    return dataset

def apriori(minspt,dataset):
    num=len(dataset)
    ps=num*minspt
    level=1
    C=ToC1(dataset)
    supt={}
    L,supt=CtoL(C,ps,dataset)
    Lres=[L]
    while 1:
        C=un(L,level)
        L,supk=CtoL(C,ps,dataset)
        if len(L)==0:
            break
        supt.update(supk)
        Lres.append(L)
        level+=1
    return Lres,supt


def ToC1(dataset):
    C=[]
    for da in dataset :
        for yu in da :
            if not [yu] in C:
                C.append([yu])
        C.sort()
    return map(frozenset,C)

def CtoL(C,ps,dataset):
    cnt={}
    L=[]
    su={}
    for ci in C:
        for da in dataset:
            if ci.issubset(da):
                if not cnt.has_key(ci): cnt[ci]=1
                else: cnt[ci]+=1
    

    for cn in cnt:
        if cnt[cn]>=ps:
            L.append(cn)
            su[cn]=cnt[cn]
    return L,su


def un(Lk,level):
    C=[]
    lenk=len(Lk)
    for i in range(lenk):
        for j in range(i+1, lenk):
            L1= list(Lk[i])[:level-1]
            L2= list(Lk[j])[:level-1]
            L1.sort()
            L2.sort()
            if L1==L2:
                C.append(Lk[i]|Lk[j])
    return C

你可能感兴趣的:(关联分析学习,机器学习与数据挖掘)