機器學習 關聯規則與FP Tree

2021-07-22 21:42:57 字數 2961 閱讀 2344

fp-tree演算法只需要遍歷一次事務,然後可以建立fp-tree樹形資料結構來表徵事務專案出現的關係。fp-tree相比原始事務,將各個事務壓縮到乙個樹,儲存了專案之間的關係和出現頻數,但是規模小得多。我可以直接根據fp-tree來獲取所有事務專案集合出現的次數。

下面是初始化步驟:

1、事務專案排序。假設我獲取了事務t,首先計算每個事務專案出現的次數,把單個事務專案次數少於閾值的事務專案去掉,因為這些事務專案的父集合一定不是頻繁集。剩下的事務專案都是1元頻繁集,按照出現次數降序列表,稱為f1。設f1表為:a,b,c,d

2、根據f1的順序,重新對每個事務進行排序。設某條事務為:c,d,a,則重排序為a,c,d。

3、每個排好序的事務都是一條路徑,我可以根據路徑構建一棵樹,書的根節點設為null。如專案事務為acd,abc,bc,那麼可以構建樹,樹節點冒號跟著出現次數:

fp-tree演算法從這裡開始進入遞迴步驟,演算法為(

輸入:事務集合 list> transactions

輸出:頻繁模式集合及相應的頻數 map,integer> frequentpattens

初始化 postmodel=,cpb=transactions

void fpgrowth(list> cpb,listpostmodel){

if cpb為空:

return

統計cpb中每乙個專案的計數,把計數小於最小支援數minsuport的刪除掉,對於cpb中的每一條事務按專案計數降序排列。

由cpb構建fp-tree,fp-tree中包含了表頭項headers,每乙個header都指向了乙個鍊錶headerlinklist,鍊錶中的每個元素都是fp-tree上的乙個節點,且節點名稱與header.name相同。

for header in headers:

newpostmodel=header.name+postmodel

把加到frequentpattens中。

newcpb=

for treenode in headerlinklist:

得到從fp-tree的根節點到treenode的全路徑path,把path作為乙個事務新增到newcpb中,要重複新增treenode.count次。

fpgrowth(newcpb,newpostmodel)

假設當前已知頻繁集b,我要找包含b且為頻繁集的父頻繁集,需要找到從根節點到b的所有路徑來構建乙個新的fp-tree。b就是postmodel字尾模式,簡寫為pm;根節點到b的所有路徑的集合就是cpb條件模式基。cpb中可能有重複的路徑,或者不同路徑有重複部分,迭代過程中按照上面的方法,用cpb來構建包含支援度資訊的fp-tree。fp-tree中單根分叉的子節點的支援度,一定小於等於父節點的支援度;不過子節點總的支援度,可能比該子節點的某個父節點要多(情況二)。這是對事務進行排序後獲得的有序結果。假設支援度閾值為最少出現3次。

上述迭代函式fpgrowth,第一步的輸入,cpb是原始的、排除了1元非頻繁集的事務路徑,pm是空,寫作null,可以認為根節點到null的路徑是所有的初始化事務路徑;header表頭項理所當然是就是f1表。第一步我遍歷f1表,表上的專案已經滿足支援度條件了,因此我將null和這些專案組合,這樣就找出了所有的1元頻繁集。然後遍歷這些1元頻繁集,倒序依次取表頭項headers的元素x作為newpm,找到當前fp-tree中根節點到x的所有路徑作為newcpb,進行下一次關於x的迭代fpgrowth;關於x的搜尋完成後,再回來進行x上乙個元素w的搜尋。整個過程類似深度搜尋。

假設d頻繁集(含有n個元素,n>0)為pm,已知cpb,那麼我重新構建fp-tree,以及乙個新的表頭項headers,headers儲存當前fp-tree中存在的元素的總出現次數。次數少於支援度閾值的節點可以預先排除。我畫出情況(1):

由於我的cpb是根節點到d的所有路徑,如果fp-tree中只有一條路徑,那麼這條路徑上的節點,都可以到d三次,彼此之間也都可以共存3次,abc任意組合都滿足支援度閾值。因此abc可以任意組合,然後末尾加上d字尾模式組成頻繁集,出現次數為3,加入置信度計算佇列中,關於d的搜尋結束。注意真實事務中,如a->b的路徑可能大於3,多出來的路徑是不會到d,我構建d的cpb時,多餘的路徑被排除了;這一輪分析中,只能得出包含d的頻繁集以及頻數,比如a->b的實際路徑頻數可能大於3,雖然我可以認定ab是頻繁集,但是不能獲得該頻繁集的真實頻數,必須在之後的迭代中才能計算得到。

如果新fp-tree有多條路徑,那麼我必須用headers表頭統一分析,不能沿著樹的分叉進行分析。我畫出情況二:

可以看出,第一條和第二條路徑中專案的支援度都為2,但是cd是頻繁集。如果單純分析每個分叉,那麼會得出沒有頻繁集的錯誤結論。這時候我需要使用剛剛建立的新表頭項headers:

a:2 b:2 c:4 (d:4)

根據表頭項,c的支援度為4,即字尾模式d可以和c組合成為支援度為4的頻繁集,然後作為新的字尾模式cd。在下一輪迭代中,新cpb的第一條路徑的節點(a:2->b:2)的支援度不滿足條件,第二條路徑為空,包含d的頻繁集搜尋完畢。

現在我來看看這個迭代過程是否能完全搜尋所有的頻繁集。在一次fp-tree迭代中,我們的搜尋從header表頭中支援度低的事務專案開始,這樣就可以保證搜尋的有序。新fp-tree的構建嚴格遵循第一次構建fp-tree時的表頭header的各個事務專案的順序,表頭中排序靠後的事務專案,在樹的單根分叉中永遠不可能出現在排序靠前的事務專案的前面。這樣,假設事務專案有abcd,從d開始迭代搜尋,可以掃瞄包含d的所有候選頻繁集;從c開始搜尋,會掃瞄包含c且不包含d的候選頻繁集,這樣就不會重複。經過迭代搜尋後,所有可能的候選頻繁集都會被掃瞄到。

資料探勘關聯規則挖掘FPtree的思想

fptree是針對apriori關聯規則挖掘演算法的改進,他的優點在於只需要掃瞄一遍資料庫,建好了fptree之後,基於樹做關聯規則挖掘就可以了,顯然大大減少了資料庫的掃瞄次數。在掃瞄左邊一條一條資料的時候,我們完成項頭表,即記錄了頻繁1項集,不但如此,還記錄這些頻繁1項集誰最頻繁,也就是次數,比如...

機器學習 淺嚐關聯規則

理解關聯規則 首先要感謝一下沃爾瑪 第乙個發現並挖掘出來了關聯規則 沃爾瑪對市場購物籃分析的結果是一組指定商品之間關係模式的關聯規則 乙個典型的規則可以表述為 第乙個關聯規則用通俗易懂的語言來表達就是 如果購買了花生醬和果醬,那麼也很有可能會購買麵包 第二個關聯規則也可以簡單的來表達 就是你把啤酒放...

機器學習實戰 關聯規則

資料探勘就是對資料進行處理,並以某種方式分析源資料,從中發現一些潛在的 有用的資訊,所以資料探勘又稱作知識發現。這裡的 某種方式 就是機器學習演算法。關聯規則作為經典機器學習演算法之一,搞懂關聯規則自然有著很重要的意義。顧名思義,關聯規則就是發現資料背後存在的某種規則或者聯絡。import nump...