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)根據最小置信度,由頻繁項集產生強關聯規則,結束。
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)); //輸出最後結果}}
-
蘋果手機長圖怎麼截圖,蘋果手機截長圖的兩種方法
1、長截圖辦法一iOS13上新之後自帶的長截圖方法,是在我們瀏覽網頁的時候使用的。操作方法:上音量鍵+開關鍵一起按下,然後點開截好的圖片,選擇“整頁”截圖即可。2、長截圖方法二利用QQ實現長截圖。操作方法:首先就是需要我們打開QQ,然後試着上音量鍵+開關鍵一起按下...
-
省內移動數據流量是指什麼
省內移動數據流量是指你的SIM卡所屬省份的可用GPRS流量,如果出了你的卡所屬的省份,去別的省,那省內移動數據流量就不可以使用,只能使用全國通用流量。移動數據流量有省內流量和全國通用流量,國內流量和省內流量是有所區別的。首先優先度不同:正常情況下,如果用戶在自...
-
關於底噪的意思介紹
1、底噪亦稱背景噪聲,基本所有的好耳機都有底噪,耳機底噪一般都是因爲前端的問題,耳機的靈敏度越高對於底噪就越敏感,一些高靈敏度和低阻抗的耳機會把底噪放大,如果加大音量的情況下,底噪會更加的明顯。2、檢測MP3底噪,一般方法是在夜晚等比較安靜的環境中戴上耳機,播...
-
黑色背景拍照竅門詳解
1、調整拍攝角度,尋找背景:既然是拍攝黑背景,在拍攝前我們儘量選擇深色的背景,這樣也就更加容易達到效果。不過深色不一定要是純黑色,只要顏色較爲深沉,偏向暗色調的均可。拍攝前多多觀察,尋找不同的拍攝角度,以找到有反差的深色作爲背景。要多嘗試不同的角度,直至主體...