java apriori是什么,讓我們一起了解一下?
Apriori算法是第一個關聯規則挖掘算法,它利用逐層搜索的迭代方法找出數據庫中項集的關系,以形成規則,其過程由連接(類矩陣運算)與剪枝(去掉那些沒必要的中間結果)組成。
Apriori算法的描述如下:
(1)掃描全部數據,產生候選1-項集的集合C1。
(2)根據最小支持度,由候選1-項集的集合C1產生頻繁1-項集的集合L1。
(3)對k>1,重復執行步驟(4)、(5)、(6)。
(4)由Lk執行連接和剪枝操作,產生候選(k+l)-項集的集合Ck+1。
(5)根據最小支持度,由候選(k+l)-項集的集合Ck+1,產生頻繁(k+1)-項集的集合Lk+1。
(6)若L≠Φ,則k=k+1,跳往步驟(4);否則,跳往步驟(7)。
(7)根據最小置信度,由頻繁項集產生強關聯規則,結束。
Apriori算法如何讓JAVA實現?
項集用HashMap
package?datamining; ? import?java.io.BufferedReader; import?java.io.File; import?java.io.FileNotFoundException; import?java.io.FileReader; import?java.io.IOException; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.HashSet; import?java.util.Iterator; import?java.util.List; import?java.util.Map; import?java.util.Set; ? public?class?Apriori?{ //剪枝函數 public?ArrayList>?apriori_gen(HashMap ,?Integer>?L_last,?int?last_index){ ArrayList >?result?=?new?ArrayList >();??//存儲剪枝后的結果 ArrayList >?item_set?=?null;?? item_set?=?get_item_set(L_last);??//獲取上一個頻繁項的所有項集,并轉為字符串List for(int?i?=?0;?i??str?=?item_set.get(i); for(int?j?=?i?+?1;?j??new_item?=?new?HashSet ();??//存儲新的候選項集 ArrayList ?str2?=?item_set.get(j); int?length?=?str.size(); for(int?k?=?0;?k??candidate,?ArrayList >?last_item_set,?int?last_index)?{ boolean?flag?=?true; ArrayList >?sub_set?=?get_subset(candidate,?last_index); //for(int?j?=?0;?j??item?=?sub_set.get(i); int?j?=?0; for(j?=?0;?j?>?get_subset(Set ?candidate,?int?index){ ArrayList >?sub_set?=?new?ArrayList >(); ArrayList ?item_set?=?new?ArrayList (); Iterator?iter?=?candidate.iterator(); while(iter.hasNext()) item_set.add((String)iter.next()); if(index?==?1)?{?????????//當index等于1時單獨考慮 for(int?k?=?0;?k??buffer?=?new?ArrayList (); buffer.add(item_set.get(k)); sub_set.add(buffer); } }else?{ for(int?i?=?0;?i??buffer?=?new?ArrayList (); buffer.add(item_set.get(i)); for(int?k?=?0;?k?>?get_item_set(HashMap ,?Integer>?L_last){ ArrayList >?result?=?new?ArrayList >(); Iterator?iter?=?L_last.entrySet().iterator(); while?(iter.hasNext())?{ Map.Entry?entry?=?(Map.Entry)?iter.next(); Set ?set?=?(Set )entry.getKey(); Iterator?iter2?=?set.iterator(); ArrayList ?item?=?new?ArrayList (); while(iter2.hasNext())?{ String?str?=?(String)iter2.next(); item.add(str); } result.add(item); } return?result; } //處理原始事物數據 public?HashMap ,?Integer>?process_rawdata(ArrayList >?raw_input,?int?min_sub){ HashMap ,?Integer>?first_input?=?new?HashMap ,?Integer>();?//存儲處理后結果 //處理原始輸入事物數據,統計每個單獨事物的次數 for(int?i?=?0;?i??item?=?raw_input.get(i); Iterator?iter?=?item.iterator(); while(iter.hasNext())?{ String?str?=?(String)iter.next(); Set ?single_item?=?new?HashSet (); single_item.add(str); if(first_input.containsKey(single_item))?{ int?count?=?first_input.get(single_item); first_input.put(single_item,?count+1); }else first_input.put(single_item,?1); } } //移除單獨事物出現次數少于min_sub的事物 for?(Iterator ,?Integer>>?iter?=?first_input.entrySet().iterator();?iter.hasNext();){ ????Map.Entry ,?Integer>?entry?=?iter.next(); Object?key?=?entry.getKey(); int?val?=?(int)entry.getValue(); if(val??item,?ArrayList >?raw_input)?{ int?count?=?0; Set ?item2?=?new?HashSet<>(item); for(int?i?=?0;?i??item_set?=?new?HashSet (raw_input.get(i)); item_set.retainAll(item2); if(item_set.size()?==?item2.size()) count++; } return?count; } //算法主函數 public?List ,?Integer>>?apriori_main(ArrayList >?raw_input,?int?min_sub){ int?last_index?=?1; List ,?Integer>>?results?=?new?ArrayList ,?Integer>>();?//存儲最終結果 HashMap ,?Integer>?first_input?=?process_rawdata(raw_input,?min_sub);?//獲取第一個頻繁項集 ArrayList >?candidates?=?apriori_gen(first_input,?last_index);?//獲取第二個候選項集 while(!(candidates.size()?==?0))?{???//循環終止條件,無法選出下一個候選集合為止 HashMap ,?Integer>?result?=?new?HashMap ,?Integer>(); for(int?i?=?0;?i?=?min_sub) result.put(candidates.get(i),?count);??//將滿足結果的加入結果集中 } if(result.size()?>?0) results.add(result); last_index++;???????????????????????????????//索引加1 candidates?=?apriori_gen(result,?last_index);??//計算下一個候選項集合 } return?results; } public?static?void?main(String?args[])?throws?IOException?{ ArrayList >?raw_data?=?new?ArrayList >();??//存儲原始數據 File?file?=?new?File(".\\data\\apriori.txt");???//獲取外部原始事物數據 BufferedReader?reader?=?new?BufferedReader(new?FileReader(file)); String?string?=?""; while((string?=?reader.readLine())!=null){ Set ?item?=?new?HashSet (); String[]?items?=?string.split(","); for(int?i?=?0;?i?,?Integer>>?result?=?apriori.apriori_main(raw_data,?2);?//定義min_sub為2 System.out.println(result.get(result.size()-1));??//輸出最后結果 } }
以上就是小編今天的分享了,希望可以幫助到大家。