java apriori

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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)根據最小置信度,由頻繁項集產生強關聯規則,結束。

java apriori

Apriori演算法如何讓JAVA實現?

項集用HashMap<Set<String>,integer>來表示,關鍵字用Set集合可以自動排序,值用於記錄項集在原始事物資料中出現的次數,原始資料用檔案方式讀取,注意檔案內容每一行為一個原始事物項,不需要輸入事物的編號。

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<Set<String>> apriori_gen(HashMap<Set<String>, Integer> L_last, int last_index){ArrayList<Set<String>> result = new ArrayList<Set<String>>();  //儲存剪枝後的結果ArrayList<ArrayList<String>> item_set = null;  item_set = get_item_set(L_last);  //獲取上一個頻繁項的所有項集,並轉為字串Listfor(int i = 0; i < item_set.size() - 1; i++) {ArrayList<String> str = item_set.get(i);for(int j = i + 1; j < item_set.size(); j++) {Set<String> new_item = new HashSet<String>();  //儲存新的候選項集ArrayList<String> str2 = item_set.get(j);int length = str.size();for(int k = 0; k < length - 1; k++) {         //進行join操作if(!str.get(k).equals(str2.get(k)))break;elsenew_item.add(str.get(k));}new_item.add(str.get(str.size()-1));new_item.add(str2.get(str2.size()-1));if(new_item.size() == length + 1 && has_infrequent_subset(new_item, item_set, last_index))  //判斷新的候選項集是否滿足所有K-1項子集要求result.add(new_item);    //滿足則加入結果集}}return result;}//判斷新的item的所有K-1項子集是否在上一個頻繁項中都出現public boolean has_infrequent_subset(Set<String> candidate, ArrayList<ArrayList<String>> last_item_set, int last_index) {boolean flag = true;ArrayList<ArrayList<String>> sub_set = get_subset(candidate, last_index);//for(int j = 0; j < sub_set.size(); j++) {//System.out.println(sub_set.get(j));//}for(int i  = 0; i < sub_set.size(); i++) {ArrayList<String> item = sub_set.get(i);int j = 0;for(j = 0; j < last_item_set.size(); j++) {if(last_item_set.get(j).equals(item))break;}if( j == last_item_set.size()) flag = false;}return flag;}//獲取候選項集的K-1項所有子集public ArrayList<ArrayList<String>> get_subset(Set<String> candidate, int index){ArrayList<ArrayList<String>> sub_set = new ArrayList<ArrayList<String>>();ArrayList<String> item_set = new ArrayList<String>();Iterator iter = candidate.iterator();while(iter.hasNext())item_set.add((String)iter.next());if(index == 1) {         //當index等於1時單獨考慮for(int k = 0; k < item_set.size(); k++) {ArrayList<String> buffer = new ArrayList<String>();buffer.add(item_set.get(k));sub_set.add(buffer);}}else {for(int i = 0; i < item_set.size() - index + 1; i++) {for(int j = i + 1; j < item_set.size(); j++) {ArrayList<String> buffer = new ArrayList<String>();buffer.add(item_set.get(i));for(int k = 0; k < index - 1; k++) {   //關鍵步驟,迴圈index-1次if((k + j) < item_set.size())buffer.add(item_set.get(k+j));}if(buffer.size() == index)sub_set.add(buffer);}}}return sub_set;}//獲取上一個頻繁項的所有項集並轉為List方便處理public ArrayList<ArrayList<String>> get_item_set(HashMap<Set<String>, Integer> L_last){ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();Iterator iter = L_last.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Set<String> set = (Set<String>)entry.getKey();Iterator iter2 = set.iterator();ArrayList<String> item = new ArrayList<String>();while(iter2.hasNext()) {String str = (String)iter2.next();item.add(str);}result.add(item);}return result;}//處理原始事物資料public HashMap<Set<String>, Integer> process_rawdata(ArrayList<Set<String>> raw_input, int min_sub){HashMap<Set<String>, Integer> first_input = new HashMap<Set<String>, Integer>(); //儲存處理後結果//處理原始輸入事物資料,統計每個單獨事物的次數for(int i = 0; i < raw_input.size(); i++) {Set<String> item = raw_input.get(i);Iterator iter = item.iterator();while(iter.hasNext()) {String str = (String)iter.next();Set<String> single_item = new HashSet<String>();single_item.add(str);if(first_input.containsKey(single_item)) {int count = first_input.get(single_item);first_input.put(single_item, count+1);}elsefirst_input.put(single_item, 1);}}//移除單獨事物出現次數少於min_sub的事物for (Iterator<Map.Entry<Set<String>, Integer>> iter = first_input.entrySet().iterator(); iter.hasNext();){    Map.Entry<Set<String>, Integer> entry = iter.next();Object key = entry.getKey();int val = (int)entry.getValue();if(val < min_sub){iter.remove();}}return first_input;}//計數函式,記錄每個候選項集在事物資料中出現的次數public int count_item(Set<String> item, ArrayList<Set<String>> raw_input) {int count = 0;Set<String> item2 = new HashSet<>(item);for(int i = 0; i < raw_input.size(); i++){Set<String> item_set = new HashSet<String>(raw_input.get(i));item_set.retainAll(item2);if(item_set.size() == item2.size())count++;}return count;}//演算法主函式public List<HashMap<Set<String>, Integer>> apriori_main(ArrayList<Set<String>> raw_input, int min_sub){int last_index = 1;List<HashMap<Set<String>, Integer>> results = new ArrayList<HashMap<Set<String>, Integer>>(); //儲存最終結果HashMap<Set<String>, Integer> first_input = process_rawdata(raw_input, min_sub); //獲取第一個頻繁項集ArrayList<Set<String>> candidates = apriori_gen(first_input, last_index); //獲取第二個候選項集while(!(candidates.size() == 0)) {   //迴圈終止條件,無法選出下一個候選集合為止HashMap<Set<String>, Integer> result = new HashMap<Set<String>, Integer>();for(int i = 0; i < candidates.size(); i++) {int count = count_item(candidates.get(i), raw_input);  //計算每個候選項集在原始事物資料中出現次數if(count >= min_sub)result.put(candidates.get(i), count);  //將滿足結果的加入結果集中}if(result.size() > 0)results.add(result);last_index++;                               //索引加1candidates = apriori_gen(result, last_index);  //計算下一個候選項集合}return results;}public static void main(String args[]) throws IOException {ArrayList<Set<String>> raw_data = new ArrayList<Set<String>>();  //儲存原始資料File file = new File(".dataapriori.txt");   //獲取外部原始事物資料BufferedReader reader = new BufferedReader(new FileReader(file));String string = "";while((string = reader.readLine())!=null){Set<String> item = new HashSet<String>();String[] items = string.split(",");for(int i = 0; i < items.length; i++)item.add(items[i]);raw_data.add(item);}Apriori apriori = new Apriori();List<HashMap<Set<String>, Integer>> result = apriori.apriori_main(raw_data, 2); //定義min_sub為2System.out.println(result.get(result.size()-1));  //輸出最後結果}}