FP-tree 關聯規則挖掘
來源:互聯網
上載者:User
關鍵字
nbsp;
規則
很
這個
FP-tree 關聯規則挖掘 博客分類: hadoop mapreducehadoop 去年公司1拆4,再拆3,在拆25,真是72搬變化,看的我等屌絲一陣膽寒,但一年過去了並沒有影響我和同事們的工作,也沒有聽得到一些負面消 息,nice,看來level還查一大大截。 拆25的一個大的結果是前臺流量必然被瓜分,這個應該會很糾結,有點遠,打住。 今年我的技術方向有BI轉向演算法多一點,這也是我個人很甘興趣的,團隊專注于CRM這一塊,現在提的比較多的是CEM,好像你還再提crm就不好意思和人打招呼。 為了提高使用者體驗,所以在做一個使用者行為分析的東東,思路就是採集使用者行為,更好的服務會員,其中一個落地點就是根據會員狀態,行為推測出來電的目的地是哪裡,即什麼問題。 關聯規則的演算法主流的有3個,Apriori,基於劃分的演算法,FP-tree,他們都有自己的側重點,百科位址:HTTP://baike.baidu.com/view/1076817.htm
基本思路都是找出頻繁項集 apriori反覆運算的方式找,效率低,但是思路很清晰,基於規劃是在它基礎上優化了性能,Fp-tree是韓佳偉設計的演算法,只需要掃描2次資料庫,性能有很大提升, 並且最主要的mahout有對應的事項,mahout對於mapreduce支援友好,所以選它了.
一、環境
FP-tree wiki HTTPs://cwiki.apache.org/confluence/display/MAHOUT/Parallel+Frequent+Pattern+Mining
hadoop 0.20.2+mahout 0.5 +jdk 1.6 不同版本間有不相容情況,這個坑我踩過了,坑和安裝見我之前的文章。 安裝環境過程中遇到好多問題,有些百度就能解決了,有好多需要谷歌看老外的論壇,覺得每次百度搞不定了就用谷歌,最後老外的解釋都挺簡單,但能解決問題,所以強烈建議在搜索之前想一下是否直接看老外的論壇, 感覺國內遇到的問題總是更豐富一下。
二、講演算法前先講一下如何配置eclipse進行debug,
1、eclipse安裝mapreduce外掛程式,網上找一個安裝就行,應該與hadoop版本沒關係
2、這個時候需要配置外掛程式的hadoop資訊了,因為需要與hadoop環境交互,所以需要知道namenode的監聽埠和jobtracker的監聽埠,如果你前面忘記了自己的配置,那查看一下檔。 不同hadoop版本的設定檔也不同,我 的是hadoop0.20.2(這也是個坑)
core-site.xml檔的fs.default.name
mapred-site.xml檔的mapred.job.tracker
這樣就可以在eclipse中run和debug了
二、演算法邏輯
程式主入口是FPGrowthDriver 其實就是一個啟動類,做一些輸入參數解析,比如輸入輸出,根據摻入的參數選擇單機還是分散式運算,由method指定,具體參數看mahout - fp-treewiki頁面(或者你輸入參數不對也會有提示的),我的method指定的mapreduce,如下代碼:
if ("sequential".equalsIgnoreCase(classificationMethod)) { runFPGrowth(params); } else if ("mapreduce". equalsIgnoreCase(classificationMethod)) { Configuration conf = new Configuration(); HadoopUtil.delete(conf, outputDir); PFPGrowth.runPFPGrowth(params);
PFPGrowth.runPFPGrowth主要計算邏輯都在這個方法總,這個方法調用了5個方法,所以計算過程可以分為5個步驟,我詳細講解下具體每一步都做了什麼,之前有參照過另一片博客,頭幾步講的很詳細,而且有圖,但是很多細節並沒有提,博客位址 是:HTTP://www.cnblogs.com/zhangchaoyang/articles/2198946.html
1、Count
startParallelCounting 這部就是個wordcount,對於DB中的每個元素做計數,可以叫做Count,這樣方便記憶和理解,產出的是一個
fList, [(薯片,7), (麵包,7), (雞蛋,7), (牛奶,5), (啤酒,4)]這個後面會用到,所以這些變數名最好都理解並記住。
2、Group
startGroupingItems fList隨機分N組,每組放maxPerGroup個元素 maxPerGroup=fList.size() / numGroups;
分組後的資料放入gList {薯片=0, 牛奶=3, 雞蛋=2, 麵包=1, 啤酒=4} 數位是組ID
本次沒有用到mapreduce,在本地完成,
fList相當於元素或元素對應編號與組的映射關係
3、code
startTransactionSorting 編號,去重,排序,輸入輸出類似如下,只不過[0, 1, 2]不是陣列,而是一個 TransactionTree,到現在位置邏輯還都很清晰,第四步開始構建樹結構了
牛奶,雞蛋,麵包,薯片 ->> 單分支的樹[0, 1, 2]
4、tree
startParallelFPGrowth
map:讀取第三步輸出的樹,並拆成多顆樹:如把[0, 1, 2] --> [0, 1, 2] [0,1] [0] 輸出K=groupId(fList中2對應的groupId) V=對應的樹
reducer:第三步中同一個groupid的輸出構建成對應的一棵樹。 然後遍歷表頭項,分別從樹上遞迴找到所有父節點,這樣表頭項中的1個元素會對應多條路徑,然後把這些路徑作為輸入到第三步,反覆運算進行
5、mining
startAggregating 根據第四步的輸出產出top k頻繁模式
ps:時間比較急,今天就搞環境和做ETL了,先寫這些,後續再更新,發現還是沒有我參照的博客寫的詳細,人家還有圖呢,後續也會做個圖,再把我代碼中的一些注釋抽取出來,會更清晰一些,方便來看的人,執行力,執行力啊, 圖會有的。 收工,回家...... 2013-03-30