美文网首页
使用Apriori算法进行关联分析(二)

使用Apriori算法进行关联分析(二)

作者: RossH | 来源:发表于2019-11-14 22:01 被阅读0次

    从频繁项集中挖掘关联规则

    频繁项集有其量化定义,即它满足最小支持度要求。对于关联规则,也有类似的量化方法,这种量化指标称为可信度。一条规则P -> H的可信度定义为\frac{support(P | H)}{support(P)}

    # 计算可信度
    def calcConf(freqSet, H, supportData, brl, minConf = 0.7):
        prunedH = []
        for conseq in H:
            # print('freqSet:', freqSet)
            # print('conseq:', conseq)
            conf = supportData[freqSet]/supportData[freqSet - conseq]
            if conf >= minConf:
                # print(freqSet - conseq, '-->', conseq, 'conf:', conf)
                brl.append((freqSet - conseq, conseq, conf))
                prunedH.append(conseq)
        return prunedH
    
    # 合并后计算可信度
    def rulesFromConseq(freqSet, H, supportData, brl, minConf = 0.7):
        m = len(H[0])
        if len(freqSet) > (m + 1):
            # 创建Hm+1条新候选规则
            Hmp1 = aprioriGen(H, m + 1)
            # print('Hmp1:', Hmp1)
            Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
            if len(Hmp1) > 1:
                rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
    
    # 关联规则生成函数
    def 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]
                # 如果频繁项集元素超过2,需要先合并
                if i > 1:
                    rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
                else:
                    calcConf(freqSet, H1, supportData, bigRuleList, minConf)
        return bigRuleList
    

    generateRules()是主函数,调用另外两个函数calcConf()rulesFromConseq(),分别用于对规则进行评估以及生成候选规则集合。

    接下来,我们会先生成一个最小支持度为0.5的频繁项集,然后基于此项集,生成最小可信度为0.7的关联规则。

    data = createData()
    L, supportData = apriori(data, minSupport = 0.5)
    rules = generateRules(L, supportData, minConf = 0.7)
    

    后面的输出是我添加的print语句。可以忽略。从中也可以看出一些关联规则生成的过程。

    打印一下rules,看一下生成的关联规则。

    结果中给出三条规则:{1} -> {3}、{2} -> {5}、{5} -> {2}。可以看到,2和5可以互换,但1和3不行。
    举个例子,你晚上有约,路过超市去买了个raincoat(小雨衣~),然后会顺便买口香糖(别问我为什么,我不知道,没买过- -),这就构成关联{raincoat} -> {口香糖}。但是买口香糖的时候,就不一定买raincoat了,可能是喜欢吃口香糖的single dog吧。所以反过来是不行的。(这个例子是我朋友提供的。至于他为什么知道。Emmm...)
    另一种情况就是,周末想在家当肥宅,你去买了可乐,然后买了零食,构成关联{可乐} -> {零食},但你也可能是先买了零食,然后才想要去买可乐,所以这两者是可以互换的。

    下面降低可信度阈值之后看一下结果:


    小结

    关联分析是用于发现大数据集中元素间有趣关系的一个工具集。有两种方式量化这些关系。一是使用频繁项集;二是关联规则,每条关联规则表示元素项之间“如果······那么”关系。

    Apriori原理是说如果一个元素项是不频繁的,那么包含该元素的超集也是不频繁的。

    相关文章

      网友评论

          本文标题:使用Apriori算法进行关联分析(二)

          本文链接:https://www.haomeiwen.com/subject/oemdictx.html