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