Apriori算法核心邏輯代碼實現

概述

Apriori算法是生成頻繁集的一種算法。Apriori原理有個重要假設,如果某個項集是頻繁的,那麼它的所有子集勢必也是頻繁的。如果一個項集是非頻繁項集,那麼它所對應的超集就全都是非頻繁項集。

實現

從大規模數據集中尋找物品間的隱含關係被稱作關聯關係,而尋找物品間的不同組合是一項十分耗時的工作,所需計算代價很高,對於包含N種物品的數據集共有2的n次方-1種項集組合,蠻力搜索並不能解決這個問題。Apriori能解決這個問題,Apriori算法是生成頻繁集的一種算法。Apriori原理有個重要假設,如果某個項集是頻繁的,那麼它的所有子集勢必也是頻繁的。如果一個項集是非頻繁項集,那麼它所對應的超集就全都是非頻繁項集。 

如果一個項集是非頻繁項集,那麼它所對應的超集就全都是非頻繁項集,如何實現呢,
代碼(部分僞代碼) :

#L指的是數據集len L[1] 表示的是{x} L2表示的是{x,y} 類似這種數據集 ,先構建L1 ,在構建L2,一次類推,通過while循環實現
#Apriori的原理體現在scan方法會將不滿足可信度的數據集刪掉,保留滿足的,這樣如果一個項集是非頻繁項集,那麼它所對應的超集就全都是非頻繁項集。 
#代碼實現參考自機器學習實戰
    while (len(L[k-2]) > 0):
        Lk, supK = scanD(x,y,z)
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L, supportData
    
    #minSupport最小支持度 
    #Ck 候選數據集列表
    def scan(D, Ck, minSupport):
    ssCnt = {}
    #增加字典對應計數器
    for tid in D:
        for can in Ck:
            if can.issubset(tid):
                if not ssCnt.has_key(can): ssCnt[can]=1
                else: ssCnt[can] += 1
    numItems = float(len(D))
    retList = []
    supportData = {}
    #計算可信度,過濾不滿足可信度的數據集
    for key in ssCnt:
        support = ssCnt[key]/numItems
        if support >= minSupport:
            retList.insert(0,key)
        supportData[key] = support
    return retList, supportData
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章