來源自 這裡
Preface:
apriori 是在資料探勘的領域中,用來找尋關聯式規則(association rules)的經典演算法之一。關聯式規則的應用,較常見的例子是在顧客的購物分析上,在其他領域也有相當多的應用。一個比較常被提出的故事為「尿布與啤酒」,這故事就是發現許多顧客買了尿布就會買啤酒。經過研究分析後,發現到:「在美國,許多年輕母親都留在家中照顧嬰兒,而父親匯到超市買尿布,但往往就會順便買啤酒」。在資料探勘的領域中,藉由「尿布與啤酒」的故事,我們發現在生活上,可存在許多表面上看似毫無關連的事物,但其實有著密不可分的關係。apriori 就是被提出用來找出這些關連的演算法之一.
Algorithm:
首先來看看這個演算法會用到的符號:
底下是演算法的文字說明:
而 Pseudo code 如下:
上面演算法的優點是 1) 簡單易懂, 2)實現複雜度低. 而缺點是 1)產生過多的 candicate itemset, 2)需重複掃描資料庫.
Implementation:
如果是 C 語言, 則你可以參考原文中的鏈結 Gist, 而下面是我使用 Java 實作的代碼. 完整的代碼可以在 這裡 下載.
- 定義訓練資料
要使用我撰寫的 Apriori 實作, 首先要定義訓練資料的類別, 而資料類別都需要實作介面 IDataBean. 這邊我定義資料類別 RichData:
上面定義了我們的資料包含了欄位 "outlook", "age", "height", "hasCar" 與 "rich", 這邊我們藉由 annotation
@Target 告訴工具說欄位 "rich" 為目標欄位, 也就是說產生的規則 condition->result 格式中欄位 "rich" 會是 result!
有了訓練資料後, 我們便可以如下進行 Apriori algorithm 的運行並列印出產生的 association rules:
執行結果如下:
Supplement:
* Apriori - Association Rule Induction / Frequent Item Set Mining
* CODE PROJECT - Apriori Algorithm
Preface:
apriori 是在資料探勘的領域中,用來找尋關聯式規則(association rules)的經典演算法之一。關聯式規則的應用,較常見的例子是在顧客的購物分析上,在其他領域也有相當多的應用。一個比較常被提出的故事為「尿布與啤酒」,這故事就是發現許多顧客買了尿布就會買啤酒。經過研究分析後,發現到:「在美國,許多年輕母親都留在家中照顧嬰兒,而父親匯到超市買尿布,但往往就會順便買啤酒」。在資料探勘的領域中,藉由「尿布與啤酒」的故事,我們發現在生活上,可存在許多表面上看似毫無關連的事物,但其實有著密不可分的關係。apriori 就是被提出用來找出這些關連的演算法之一.
Algorithm:
首先來看看這個演算法會用到的符號:
底下是演算法的文字說明:
而 Pseudo code 如下:
- L(1) = Scan database to find {frequent itemset}
- do
- Gnerate C(k+1) from L(k)
- Remove the itemset which has any subset that is not a frequent itemset (detect from L(k))
- L(k+1) = candicates in C(k+1) with min_support
- for all possible of partition L(k+1) into two parts A,B
- if P(L(k+1)) / P(A) >= min_confidence
- A => B is one association rule
- until L(k+1) is ∅
Implementation:
如果是 C 語言, 則你可以參考原文中的鏈結 Gist, 而下面是我使用 Java 實作的代碼. 完整的代碼可以在 這裡 下載.
- 定義訓練資料
要使用我撰寫的 Apriori 實作, 首先要定義訓練資料的類別, 而資料類別都需要實作介面 IDataBean. 這邊我定義資料類別 RichData:
- package ml.alg.apriori;
- public class RichData implements IDataBean{
- public String outlook=null;
- public String age=null;
- public String height=null;
- public Boolean hasCar=null;
- @Target
- public Boolean rich=null;
- public RichData()
- {
- }
- public RichData(String outlook, String age, String height, boolean hasCar, boolean rich)
- {
- this.outlook = outlook;
- this.age = age;
- this.height = height;
- this.hasCar = hasCar;
- this.rich = rich;
- }
- }
有了訓練資料後, 我們便可以如下進行 Apriori algorithm 的運行並列印出產生的 association rules:
- Apriori apriori = new Apriori(Level.ALL);
- // Add training data set
- apriori.addT(AddRichData("ugly", "m", "m", true, true));
- apriori.addT(AddRichData("normal", "y", "m", false, false));
- apriori.addT(AddRichData("handsome", "m", "h", false, false));
- apriori.addT(AddRichData("ugly", "o", "l", false, false));
- apriori.addT(AddRichData("normal", "m", "m", true, true));
- apriori.addT(AddRichData("normal", "y", "m", false, false));
- apriori.addT(AddRichData("normal", "m", "m", true, true));
- apriori.addT(AddRichData("ugly", "o", "h", false, true));
- apriori.addT(AddRichData("handsome", "y", "h", true, true));
- apriori.addT(AddRichData("handsome", "y", "l", false, true));
- apriori.addT(AddRichData("ugly", "y", "l", true, true));
- apriori.addT(AddRichData("ugly", "m", "l", false, false));
- apriori.addT(AddRichData("ugly", "y", "l", false, true));
- apriori.addT(AddRichData("normal", "m", "m", true, true));
- apriori.addT(AddRichData("ugly", "o", "m", true, true));
- apriori.addT(AddRichData("handsome", "m", "m", false, false));
- apriori.addT(AddRichData("handsome", "y", "m", false, false));
- apriori.addT(AddRichData("handsome", "y", "m", false, true));
- apriori.addT(AddRichData("handsome", "y", "l", false, false));
- apriori.addT(AddRichData("handsome", "m", "m", true, true));
- apriori.addT(AddRichData("ugly", "o", "l", true, true));
- apriori.addT(AddRichData("normal", "m", "h", true, false));
- apriori.addT(AddRichData("normal", "m", "h", false, false));
- apriori.addT(AddRichData("normal", "m", "h", true, true));
- apriori.addT(AddRichData("normal", "m", "m", true, true));
- // Run association learning
- List
ruleList = apriori.run(); - // Output result
- for(Rule r:ruleList) System.out.printf("%s\n", r);
Supplement:
* Apriori - Association Rule Induction / Frequent Item Set Mining
* CODE PROJECT - Apriori Algorithm
This message was edited 16 times. Last update was at 30/05/2013 13:37:02
Sample code download link updated to: https://www.space.ntu.edu.tw/navigate/s/6B5397CFF3C942B18D0DE348651F0751QQY
回覆刪除哇~ 這裡整得真是詳細啊! 相信您已是一方高手了!
回覆刪除不過, 上面這一行好像打錯了....
Confidence:Conf( X → Y) = Support( X ∪ Y ) / Support( X ) = P( Y | X )
分子的 Support( X ∪ Y )應該是交集、不是聯集ㄟ.....
You are right! Many thanks for the reminding and the content is updated as well.
刪除我覺得如果X,Y是單純指itemset則應該是聯集(因為X和Y的itemset要同時出現在一個集合才算。);
刪除如果X,Y是指滿足itemset背後的transactions則應該是交集。
不知道這樣理解有沒有錯。