關聯規則挖掘演算法 FP Growth

2021-07-26 01:12:41 字數 4596 閱讀 2953

它仍可能產生大量的候選集。例如,如果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...