Apriori算法核心邏輯代碼實現

概述算法

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

實現app

從大規模數據集中尋找物品間的隱含關係被稱做關聯關係,而尋找物品間的不一樣組合是一項十分耗時的工做,所需計算代價很高,對於包含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
相關文章
相關標籤/搜索