機器學習之FP-growth頻繁項集演算法
阿新 • • 發佈:2018-11-07
FP-growth演算法
專案背景/目的
對於廣告投放而言,好的關聯會一定程度上提高使用者的點選以及後續的諮詢成單
對於產品而言,關聯分析也是提高產品轉化的重要手段,也是大多商家都在做的事情,尤其是電商平臺
曾經我用SPSS Modeler做過Apriori關聯分析模型,也能滿足需求,但是效果自然是不及python了,這裡分享一下操作流程
還有一週就雙十一了,那不妨去看看產品關聯背後的原理
專案原理
步驟一 資料處理
1.遍歷所有的資料集合,計算所有項的支援度(次數)
2.丟棄非頻繁項(次數小於2)
3.再對所有出現次數降序排列
4.對所有的資料集按照支援度排序,並丟棄非頻繁項
~ 到這一步整個資料就處理好了,後面就是生成FP tree以及節點連結串列
步驟二 FP樹建立
1.讀取每個集合插入FP樹中,同時用一個頭部連結串列資料結構維護不同集合的相同項,這裡講根節點設定為null,就是指根節點不包括任何的項,是為了任何一個數據集進來都被視為空項開始的
2.每新增一個計數加1,沒有重合則新增一個節點
步驟三 從FP數中挖掘頻繁項集
1.對頭部連結串列進行降序排序
2.對頭部連結串列節點從小到大遍歷,得到條件模式基,同時獲得一個頻繁項集
也就是說對項頭表頻率最小的開始,找對其對於的葉子節點並計數,也就是其對應的條件模式基
這裡的葉子節點計數為 {A:2,C:2,E:1,G:1,D:1},刪除閾值小於2的 故只有A,C
程式碼解釋
FP樹的節點結構
class treeNode: def __init__(self, nameValue, numOccur, parentNode): self.name = nameValue # 節點名稱 self.count = numOccur # 節點出現次數 self.nodeLink = None # 不同項集的相同項通過nodeLink連線在一起 self.parent = parentNode # 指向父節點 self.children = {} # 儲存葉子節點 如果需要了解更多機器學習相關內容可以加群:4 2 5 85 19 55獲取免費資料 def inc(self, numOccur): """inc(對count變數增加給定值) """ self.count += numOccur def disp(self, ind=1): """disp(用於將樹以文字形式顯示) """ print(' '*ind, self.name, ' ', self.count) for child in self.children.values(): child.disp(ind+1) def __lt__(self, other): return self.count < other.count
讀取資料並呼叫createTree方法,設定頻繁項集(也就是出現次數這裡是100000)
parsedDat = [line.split() for line in open('kosarak.dat').readlines()]
initSet = createInitSet(parsedDat)
myFPtree, myHeaderTab = createTree(initSet, 100000)
如果需要了解更多機器學習相關內容可以加群:4 2 5 85 19 55獲取免費資料
呼叫mineTree方法
myFreList = [] mineTree(myFPtree, myHeaderTab, 100000, set([]), myFreList) print(myFreList)
由於程式碼量較大就不一一copy上了
結論
最終輸出如下結果,eg:瀏覽(購買)過1的同時也瀏覽(購買)了6,幾百萬的資料量執行也是很快的