Apriori算法基本概念以及原理解析

Apriori算法中几个重要的概念

A—>B:
支持度: P(A^B) 表示A和B同时发生时的概率,没有先后顺序。
可信度或置信度: P(B|A) 表示A发生时,B发生的概率,有先后顺序。
P(B|A) = P(A^B)/P(A)
频繁项集:满足最小支持度阀值的事件集,如果事件里面有k个元素,就是频繁k项集。频繁项集通俗点来说,就是经常同时出现的一些元素的集合。

Apriori算法原理

AprioriApriori 的原理:如果某个项集是频繁项集,那么它所有的子集也是频繁的。
即如果 {0,1} 是频繁的,那么 {0}, {1} 也一定是频繁的。

Apriori算法步骤

  1. 发现频繁项集(循环,从a到g产生候选集后,会回到扫描元素,由产生频繁k项集到循环后产生频繁k+1项集)
    a.扫描元素
    b.计算支持度
    c.统计筛选
    d.产生频繁项集
    e.自链接
    f.减枝
    g.产生候选集
  2. 产生关联规则

Apriori算法原理(python版)


class Apriori:

    @classmethod
    def caculate(cls, dataSet, minSupport=0.5):
        C1 = cls.createC1(dataSet)
        # 将dataSet集合化,以满足scanD的格式要求
        # D = map(set, dataSet)
        L1, supportData = cls.scanD(dataSet, C1, minSupport)
        L = [L1]
         # 最初的L1中的每个项集含有一个元素,新生成的
         # 项集应该含有2个元素,所以 k=2
        k = 2
        while (len(L[k - 2]) > 0):
            Ck = cls.aprioriGen(L[k - 2], k)
            Lk, supK = cls.scanD(dataSet, Ck, minSupport)
            # 将新的项集的支持度数据加入原来的总支持度字典中
            supportData.update(supK)
            # 将符合最小支持度要求的项集加入L
            L.append(Lk)
            # 新生成的项集中的元素个数应不断增加
            k += 1
        # 返回所有满足条件的频繁项集的列表,和所有候选项集的支持度信息
        return L, supportData

    @classmethod
    def createC1(self, dataSet):
     '''
    构建初始候选项集的列表,即所有候选项集只包含一个元素,
    C1是大小为1的所有候选项集的集合
    '''
        C1 = []
        for transaction in dataSet:
            for item in transaction:
                if not [item] in C1:
                    C1.append([item])
        C1.sort()
        return map(frozenset, C1)

    @classmethod
    def aprioriGen(cls, Lk, k):
     '''
    由初始候选项集的集合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 retList

    @classmethod
    def scanD(self, D, Ck, minSupport):
     '''
    计算Ck中的项集在数据集合D(记录或者transactions)中的支持度,
    返回满足最小支持度的项集的集合,和所有项集支持度信息的字典。
    '''
        ssCnt = {}
        l_Ck = list(Ck)
        for tid in D:
        # 对于每一条transaction
            for can in l_Ck:
            # 对于每一个候选项集can,检查是否是transaction的一部分
            # 即该候选can是否得到transaction的支持
                if can.issubset(tid):
                    if ssCnt.get(can) == None: ssCnt[can] = 1
                    else: ssCnt[can] += 1
        numItems = float(len(D))
        retList = []
        supportData = {}
        for key in ssCnt:
        # 每个项集的支持度
            support = ssCnt[key]/numItems
            # 将满足最小支持度的项集,加入retList
            if support >= minSupport:
                retList.insert(0, key)
            else:
                #print(str(key) + "支持度:" + str(support)+ ",小于最小支持度:" + str(minSupport))
                pass
            # 汇总支持度数据
            supportData[key] = support
        return retList, supportData
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值