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

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

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

# 计算可信度
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算法进行关联分析(二))