概述算法
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