它仍可能產生大量的候選集。例如,如果10的4次方個頻繁1項集,則apriori演算法需要產生多達10的7次方個候選2項集。
它可能需要重複地掃瞄資料庫,通過模式匹配檢查乙個很大的候選集合。檢查資料庫中每個事務來確定候選集支援度的開銷很大。
fp-growth可以消除上述apriori演算法的兩中開銷。
fp-growth採用如下分治策略:首先,將代表頻繁項集的資料庫壓縮到一棵頻繁模式樹(fp樹),該樹仍保留項集的關聯資訊。然後把這種壓縮後的資料庫劃分成一組條件資料庫,每個資料庫關聯乙個頻繁模式,並分別挖掘每個條件資料庫。
fp-growth演算法
構建樹的過程如下:
class
treenode:
""" fp-tree節點
"""def__init__
(self, namevalue, numoccur, parentnode):
self.name = namevalue
self.count = numoccur
self.nodelink = none
self.parent = parentnode
self.children = {}
definc(self, numoccur):
self.count += numoccur
defdisplay
(self, ind=1):
print(' '*ind, self.name, ' ', self.count)
for child in self.children.values():
child.display(ind+1)
defcreateinitset
(dataset):
retdict = {}
for trans in dataset:
retdict[frozenset(trans)] = 1
return retdict
defcreatetree
(dataset, minsuppport=1):
''' 構造fp-tree
:param dataset:
:param minsuppport: 最小支援度--某個頻繁項集在所有事務中出現的頻數的最小值,這裡是頻數不是頻率
:return: fp-tree,和頭鍊錶
'''###################構造頭鍊錶和1維頻繁集########################
headertable = {}
for trans in dataset:
for item in trans:
headertable[item] = headertable.get(item, 0) + dataset[trans]
for k in list(headertable.keys()):
if headertable[k] < minsuppport: #頻數小於最小支援度的刪除
del(headertable[k])
freqitemset = set(headertable.keys()) #1維頻繁項集
if (len(freqitemset) == 0):
return
none,none
for k in headertable.keys():
headertable[k] = [headertable[k], none]
###################構造頭鍊錶和1維頻繁集########################
root = treenode('null', 1, none)
#從每條記錄中抽取出現在1維頻繁項集中的元素,然後按照頻數從大到小排序,最後更新fp-tree
for transet, count in dataset.items():
locald = {}
for item in transet:
if item in freqitemset:
locald[item] = headertable[item][0]
if len(locald) > 0:
ordereditems = [v[0] for v in sorted(locald.items(), key=lambda p:p[1], reverse=true)]
updatetree(ordereditems, root, headertable, count)
print('headertable: ', headertable)
return root,headertable
defupdatetree
(items, intree, headertable, count):
''' 遞迴更新fp樹和頭鍊錶
:param items:
:param intree:
:param headertable:
:param count:
:return: 無
'''if items[0] in intree.children.keys():
intree.children[items[0]].inc(count)
else:
intree.children[items[0]] = treenode(items[0], count, intree)
if headertable[items[0]][1] == none:
headertable[items[0]][1] = intree.children[items[0]]
else:
updateheader(headertable[items[0]][1], intree.children[items[0]])
if len(items) > 1:
updatetree(items[1::], intree.children[items[0]], headertable, count)
defupdateheader
(nodetotest, targetnode):
while nodetotest.nodelink != none:
nodetotest = nodetotest.nodelink
nodetotest.nodelink = targetnode
挖掘樹的演算法如下:
def
ascendtree
(leafnode, prefixpath):
if leafnode.parent != none:
ascendtree(leafnode.parent, prefixpath)
deffindprefixpath
(basepattern, treenode):
conditionpatterns = {}
while treenode != none:
prefixpath =
ascendtree(treenode, prefixpath)
if len(prefixpath) > 1:
conditionpatterns[frozenset(prefixpath[1:])] = treenode.count
treenode = treenode.nodelink
return conditionpatterns
defminetree
(intree, headertable, minsupport, prefix, freqitemlist):
''' 從fp-tree中挖掘頻繁項集
:param intree: fp-tree
:param headertable: 頭鍊錶
:param minsupport:
:param prefix: 用於遞迴呼叫時產生頻繁項
:param freqitemlist: 儲存結果list
:return:
'''#首先,headertable中從頻數最小的開始,排序
bigl = [v[0] for v in sorted(headertable.items(), key=lambda p: p[1][0])]
#遍歷頭鍊錶的每個節點元素
for basepat in bigl:
newfreqset = prefix.copy()
# newfreqset.add(basepat)
freqitemlist.insert(0, newfreqset)
cpb = findprefixpath(basepat, headertable[basepat][1]) #條件模式基
conditiontree, conditionheadtab = createtree(cpb, minsupport)
if conditionheadtab != none:
print('conditional tree for: ', newfreqset)
conditiontree.display(1)
minetree(conditiontree, conditionheadtab, minsupport, newfreqset, freqitemlist)
fp-growth演算法介紹完畢!! 關聯規則挖掘 Apriori演算法
1 apriori 介紹 apriori演算法使用頻繁項集的先驗知識,使用一種稱作逐層搜尋的迭代方法,k項集用於探索 k 1 項集。首先,通過掃瞄資料庫,累積每個項的計數,並收集滿足最小值尺度的項,找出頻繁 1 項集的集合,該集合記做 l1 然後利用 l1 找頻繁 2 項集的集合 l2 l2 找 l...
關聯規則挖掘
關聯規則反映事物之間的相互依存性和關聯性。如果事物之間存在一定的關聯,那麼我們就可以通過乙個事物去 另乙個事物。我們要挖掘大量資料中人們感興趣的,有價值的資訊,包括概念,規則,規律等。關聯規則 發現資料中的規律 超市中什麼產品會 起購買?組合推薦 顧客在買了 臺pc之後下 步會購買?搭配推薦 哪種d...
關聯規則挖掘
直接用例項來解釋概念更清楚一些,加入資料庫中存在10條交易記錄 transaction 具體如下表所示 交易id tid 購買商品 items b bread c cream m milk t tea t01b c m t t02b c m t03c m t04m t t05b c m t06b t...