1. 程式人生 > >第11章:使用Apriori演算法進行關聯分析(從頻繁項集中挖掘關聯規則)

第11章:使用Apriori演算法進行關聯分析(從頻繁項集中挖掘關聯規則)

原理:

根據頻繁項集找關聯規則,如有一個頻繁項集{豆奶,萵苣},那麼可能有一條關聯規則是豆奶->萵苣,即一個人購買了豆奶,則大可能他會購買萵苣,但反過來一個人購買了萵苣,不一定他會購買豆奶,頻繁項集使用支援度量化,關聯規則使用可信度或置信度量化。一條規則P->H的可信度定義為支援度(P|H)/支援度(P)。(注意:python中'|'表示並集,數學中'U'表示並集)

網路示意圖:

       該圖為頻繁項集{0,1,2,3}的關聯規則網路示意圖,陰影區域是第可信度的規則,如果發現0,1,2->3是低可信度的,則以3為後件的規則可信度也會低。因此,先從一個頻繁項集出發(單個元素是沒有關聯規則的,因此從兩個元素的頻繁項集出發),建立一個規則列表,該規則右邊只包含一個元素,然後對這些規則測試;然後合併所有規則建立新的關聯列表,該規則右邊包含兩個元素,以此類推。

程式碼:

def generateRules(L,supportData,minConf=0.5):
    bigRuleList=[]
    for i in range(1,len(L)):
        for freqSet in L[i]:
            H1=[frozenset([item]) for item in freqSet]  #H1是單個元素集合
            if(i>1):
                #pdb.set_trace()
                rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
            else:
                calcConf(freqSet,H1,supportData,bigRuleList,minConf)
    return bigRuleList

#對於兩個元素的集合計算置信度
def calcConf(freqSet,H,supportData,br1,minConf=0.5):  #freqSet頻繁項集
    prunedH=[]
    for conseq in H:
        conf=supportData[freqSet]/supportData[freqSet-conseq]
        if conf>=minConf:
            #pdb.set_trace()
            print(freqSet-conseq,"-->",conseq,'conf: %3.f'%conf)
            br1.append((freqSet-conseq,conseq,conf))
            prunedH.append(conseq)
    return prunedH

#對於多於兩個元素的集合,先將元素分為兩兩結合的,然後對於兩兩結合的計算置信度
def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.5):
    m=len(H[0])
    if(len(freqSet)>(m+1)):
        Hmp1=aprioriGen(H,m+1)
        Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)
        if len(Hmp1)>1:
            rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)