日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(精)广东工业大学 2018实时大数据分析——A-Priori算法实验报告

發布時間:2023/12/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (精)广东工业大学 2018实时大数据分析——A-Priori算法实验报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(精)廣東工業大學 2018實時大數據分析——A-Priori算法實驗報告

一、實驗內容

給定某超市購物籃數據庫文件basketdata.xls,里面有18項商品的747條購買記錄。取支持度閾值s =185,用A-Priori算法在Map-Reduce框架下提取其中的最大頻繁項集Lk。

附件:某超市數據集basketdata.xls

二、實驗設計(原理分析及流程)

該算法的基本思想是:首先找出所有的頻集,這些項集出現的頻繁性至少和預定義的最小支持度一樣。然后由頻集產生強關聯規則,這些規則必須滿足最小支持度和最小可信度。然后使用第1步找到的頻集產生期望的規則,產生只包含集合的項的所有規則,其中每一條規則的右部只有一項,這里采用的是中規則的定義。一旦這些規則被生成,那么只有那些大于用戶給定的最小可信度的規則才被留下來。為了生成所有頻集,使用了遞歸的方法。

三、實驗代碼及數據記錄

1.代碼

1.0 文件結構圖

1.1 CandidateItemsetBean.java

package com.devyy.bean;import java.util.List;/** * 候選項集實體類 * * @author ZYY* */ public class CandidateItemsetBean {private List<List<Integer>> candidateItemList;public List<List<Integer>> getCandidateItemList() {return candidateItemList;}public void setCandidateItemList(List<List<Integer>> candidateItemList) {this.candidateItemList = candidateItemList;} }

1.2 DataBean.java

package com.devyy.bean;/** * DataVO實體類,封裝了頻繁項集,候選項集,非頻繁項集。* * @author ZYY* */ public class DataBean {private FrequentItemsetBean frequentItemSet;private CandidateItemsetBean candidateItemSet;private InFrequentItemsetBean inFrequentItemSet;public FrequentItemsetBean getFrequentItemSet() {return frequentItemSet;}public void setFrequentItemSet(FrequentItemsetBean frequentItemSet) {this.frequentItemSet = frequentItemSet;}public CandidateItemsetBean getCandidateItemSet() {return candidateItemSet;}public void setCandidateItemSet(CandidateItemsetBean candidateItemSet) {this.candidateItemSet = candidateItemSet;}public InFrequentItemsetBean getInFrequentItemSet() {return inFrequentItemSet;}public void setInFrequentItemSet(InFrequentItemsetBean inFrequentItemSet) {this.inFrequentItemSet = inFrequentItemSet;} }

1.3 FrequentItemsetBean.java

package com.devyy.bean;import java.util.List;/** * 頻繁項集實體類 * * @author ZYY* */ public class FrequentItemsetBean {private List<List<Integer>> frequentItemList;public List<List<Integer>> getFrequentItemList() {return frequentItemList;}public void setFrequentItemList(List<List<Integer>> frequentItemList) {this.frequentItemList = frequentItemList;} }

1.4 InFrequentItemsetBean.java

package com.devyy.bean;import java.util.List;/** * 非頻繁項集實體類 * * @author ZYY* */ public class InFrequentItemsetBean {private List<List<Integer>> inFrequentItemList;public List<List<Integer>> getInFrequentItemList() {return inFrequentItemList;}public void setInFrequentItemList(List<List<Integer>> inFrequentItemList) {this.inFrequentItemList = inFrequentItemList;} }

1.5 ExcelUtil.java

package com.devyy.util;import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List;import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException;/** * ExcelUtil* * 需導入 jxl.jar 包,其常用方法總結如下: * (1)Workbook為Excel文件,Cell為單元格,Sheet為工作表對象 * (2)sheet.getCell(x,y):獲得第x行第y列的單元格 * (3)workbook.getWorkbook(File):獲得文件 * (4)workbook.getSheet(0):獲得0號(第一個)工作表對象 * (5)cell.getContents():獲得單元格的內容 * (6)Cell[] cells = sheet.getColumn(column):獲得某一列的值 * (7)Cell[] cells = sheet.getRow(row):獲得某一行的值 * * @author ZYY* */ public class ExcelUtil {/*** 讀取Excel文件* * @param filePath——Excel文件路徑* @return Workbook*/public Workbook readExcel(String filePath) {File file = new File(filePath);Workbook workbook = null;try {workbook = Workbook.getWorkbook(file);System.out.println(filePath + "文件讀取成功!");} catch (BiffException e) {System.out.println("輸入流讀入為空,java讀取Excel異常");e.printStackTrace();} catch (IOException e) {System.out.println("IO異常");e.printStackTrace();}return workbook;}/*** 對Excel文件工作表的內容進行封裝* * @param workbook——Excel文件* @param sheetLoca——工作表位置* @param initRowLoca——初始行,即非表頭行的記錄開始的行數* @return 返回一個封裝了一行行數據的List*/public List<Cell[]> sheetEncapsulation(Workbook workbook, int sheetLoca, int initRowLoca) {Sheet sheet = workbook.getSheet(sheetLoca);List<Cell[]> list = new ArrayList<Cell[]>();Cell[] cells = null;int i = initRowLoca - 1, length = sheet.getRows() - initRowLoca + 1;while (length-- != 0) {cells = sheet.getRow(i);list.add(cells);i++;}return list;}/*** 當表頭存在多行時,獲得某一特定所需表頭行,將該表頭行信息保存為一個Cell數組* * @param workbook——Excel文件* @param sheetLoca——工作表位置* @param wantLoca——想獲得的特定表頭行位置* @return 該表頭行信息Cell[]數組*/public Cell[] getHeadInfo(Workbook workbook, int sheetLoca, int wantLoca) {if (wantLoca == -1) {return null;} else {Sheet sheet = workbook.getSheet(sheetLoca);Cell[] cells = sheet.getRow(wantLoca - 1);return cells;}} }

1.6 PrintUtil.java

package com.devyy.util;import java.util.Iterator; import java.util.List;import com.devyy.bean.CandidateItemsetBean; import com.devyy.bean.FrequentItemsetBean;import jxl.Cell;/** * PrintUtil* * 處理程序打印語句的工具類 * * @author ZYY* */ public class PrintUtil {/*** 打印當前候選集內容* * @param set——候選項集* @param cell——表頭信息數組*/public void printCandidateItemSetContent(CandidateItemsetBean set, Cell[] cell) {System.out.println("------------------當前候選集中的內容為------------------");int i = 1, j = 0;List<List<Integer>> list = set.getCandidateItemList();for (Iterator<List<Integer>> iter = list.iterator(); iter.hasNext();) {List<Integer> integerList = iter.next();System.out.print("第" + i + "項的內容為:{");for (j = 0; j < integerList.size() - 1; j++) {System.out.print(cell[integerList.get(j)].getContents() + ", ");}System.out.print(cell[integerList.get(integerList.size() - 1)].getContents());System.out.println("}");i++;}}/*** 打印頻繁項集的內容* * @param set——頻繁項集* @param cell——表頭信息數組*/public void printFrequentItemSetContent(FrequentItemsetBean set, Cell[] cell) {System.out.println("------------------頻繁項集的內容為------------------");int i = 1, j = 0;List<List<Integer>> list = set.getFrequentItemList();for (Iterator<List<Integer>> iter = list.iterator(); iter.hasNext();) {List<Integer> integerList = iter.next();System.out.print("第" + i + "項的內容為:{");for (j = 0; j < integerList.size() - 1; j++) {System.out.print(cell[integerList.get(j)].getContents() + ", ");}System.out.print(cell[integerList.get(integerList.size() - 1)].getContents());System.out.println("}");i++;}}/*** 打印最大頻繁項集的內容* * @param list——封裝最大頻繁項集的list* @param cell——表頭信息數組*/public void printBiggestFrequentItemSetContent(List<List<Integer>> list, Cell[] cell) {int j;System.out.println("------------------最大頻繁項集為------------------");for (Iterator<List<Integer>> iter = list.iterator(); iter.hasNext();) {List<Integer> integerList = iter.next();System.out.print("{");for (j = 0; j < integerList.size() - 1; j++) {System.out.print(cell[integerList.get(j)].getContents() + ", ");}System.out.print(cell[integerList.get(integerList.size() - 1)].getContents());System.out.println("}");}} }

1.7 Apriori.java

package com.devyy;import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Scanner; import java.util.Set;import com.devyy.bean.CandidateItemsetBean; import com.devyy.bean.DataBean; import com.devyy.bean.FrequentItemsetBean; import com.devyy.bean.InFrequentItemsetBean; import com.devyy.util.ExcelUtil; import com.devyy.util.PrintUtil;import jxl.Cell; import jxl.Sheet; import jxl.Workbook;/** * 首先通過單遍掃描數據集,確定每個項的支持度,得到頻繁1-項集。 * 接著* (1)連接 * (2)剪枝 * 采用迭代的方法利用頻繁k-1-項集生成k候選項集,掃描Excel表后從候選k-項集中找出頻繁k-項集。直到生成的候選項集為空時算法結束。 * 其中,用到 Apriori 性質: * 一個頻繁項集的任一子集也應是頻繁項集。 * 逆否命題:如果一個項集是非頻繁的,則它的超集也是非頻繁的。 * * @author ZYY* */ public class Apriori {// 定義創建存放最大項集時數組的長度為100public static final int biggestLength = 100;private ExcelUtil excelUtil = new ExcelUtil();private PrintUtil printUtil = new PrintUtil();/*** 計算Excel表中的列長度* @param list——存放Excel表中單元格內容的Cell數組* @return 列長度*/public int getColumnLength(List<Cell[]> list) {int maxLength = 0;Cell[] cells = null;for (int i = 0; i < list.size(); i++) {cells = list.get(i);if (cells.length > maxLength) {maxLength = cells.length;}}return maxLength;}/*** 首先確定每個項的支持度,得到頻繁1-項集及候選1-項集* @param list——存放了Excel每行記錄的一個list* @param columnInitLoca——要進行頻繁項集篩選的首列位置* @param threshold——閾值* @return 返回DataBean實體*/public DataBean getFrequentOneItemset(List<Cell[]> list, int columnInitLoca, int threshold) {int i, j, maxLength = getColumnLength(list);DataBean dataBean = new DataBean();FrequentItemsetBean frequentItemSet = new FrequentItemsetBean();CandidateItemsetBean candidateItemSet = new CandidateItemsetBean();InFrequentItemsetBean inFrequentItemSet = new InFrequentItemsetBean();Cell[] cells = null;Integer[] countArray = new Integer[maxLength];List<List<Integer>> frequentItemList = new ArrayList<List<Integer>>();List<List<Integer>> inFrequentItemList = new ArrayList<List<Integer>>();for (i = 0; i < countArray.length; i++) {countArray[i] = 0;}for (i = 0; i < list.size(); i++) {cells = list.get(i);for (j = columnInitLoca - 1; j < cells.length; j++) {if (cells[j].getContents().equals("T")) {countArray[j]++;}}}for (i = 0; i < countArray.length; i++) {if (countArray[i] >= threshold) {List<Integer> integerList = new ArrayList<Integer>();integerList.add(i);frequentItemList.add(integerList);} else {List<Integer> integerList2 = new ArrayList<Integer>();integerList2.add(i);inFrequentItemList.add(integerList2);}}frequentItemSet.setFrequentItemList(frequentItemList);candidateItemSet.setCandidateItemList(frequentItemList);inFrequentItemSet.setInFrequentItemList(inFrequentItemList);dataBean.setFrequentItemSet(frequentItemSet);dataBean.setCandidateItemSet(candidateItemSet);dataBean.setInFrequentItemSet(inFrequentItemSet);return dataBean;}/*** 對候選子集進行剪枝* @param dataBean——DataBean實體* @return 返回修改后的DataBean實體*/public DataBean pruning(DataBean dataBean) {InFrequentItemsetBean inFrequentItemSet = dataBean.getInFrequentItemSet();CandidateItemsetBean candidateItemSet = dataBean.getCandidateItemSet();List<List<Integer>> inFrequentItemList = inFrequentItemSet.getInFrequentItemList();List<List<Integer>> candidateItemList = candidateItemSet.getCandidateItemList();List<List<Integer>> candidateItemWillBeMovedList = new ArrayList<List<Integer>>();for (Iterator<List<Integer>> iter = candidateItemList.iterator(); iter.hasNext();) {List<Integer> candidateItem = iter.next();for (Iterator<List<Integer>> iter2 = inFrequentItemList.iterator(); iter2.hasNext();) {List<Integer> inFrequentItem = iter2.next();if (candidateItem.containsAll(inFrequentItem)) {candidateItemWillBeMovedList.add(candidateItem);}}}inFrequentItemList.addAll(candidateItemWillBeMovedList);candidateItemList.removeAll(candidateItemWillBeMovedList);candidateItemSet.setCandidateItemList(candidateItemList);inFrequentItemSet.setInFrequentItemList(inFrequentItemList);dataBean.setCandidateItemSet(candidateItemSet);dataBean.setInFrequentItemSet(inFrequentItemSet);return dataBean;}/*** 組成新的候選子集* @param dataBean——DataBean實體* @return 修改后的DataBean實體*/public DataBean createCandidateItemSet(DataBean dataBean) {CandidateItemsetBean candidateItemSet = dataBean.getCandidateItemSet();List<List<Integer>> candidateItemList = candidateItemSet.getCandidateItemList();List<List<Integer>> newCandidateItemList = new ArrayList<List<Integer>>();Set<List<Integer>> newCandidateItemListSet = new HashSet<List<Integer>>();for (int i = 0; i < candidateItemList.size(); i++) {List<Integer> candidateItem1 = candidateItemList.get(i);for (int j = i + 1; j < candidateItemList.size(); j++) {Set<Integer> set = new HashSet<Integer>();List<Integer> candidateItem2 = candidateItemList.get(j);for (int m = 0; m < candidateItem1.size(); m++) {set.add(candidateItem1.get(m));set.add(candidateItem2.get(m));}if (set.size() == (candidateItem1.size() + 1)) {List<Integer> newCandidateList = new ArrayList<Integer>();newCandidateList.addAll(set);newCandidateItemList.add(newCandidateList);}}}newCandidateItemListSet.addAll(newCandidateItemList);List<List<Integer>> resultList = new ArrayList<List<Integer>>();resultList.addAll(newCandidateItemListSet);candidateItemSet.setCandidateItemList(resultList);dataBean.setCandidateItemSet(candidateItemSet);return dataBean;}/*** 得到頻繁-k項集* @param dataBean——DataBean實體* @param sheet——工作表* @param cellList——單元格List* @param threshold——閾值* @param columnInitLoca——要進行頻繁項集篩選的首列位置* @return 修改后的DataBean實體*/public DataBean getFrequentKItemSet(DataBean dataBean, Sheet sheet, List<Cell[]> cellList, int threshold,int columnInitLoca) {int i, j, n;boolean flag = true;FrequentItemsetBean frequentItemSet = dataBean.getFrequentItemSet();List<List<Integer>> frequentItemList = frequentItemSet.getFrequentItemList();CandidateItemsetBean candidateItemSet = dataBean.getCandidateItemSet();List<List<Integer>> candidateItemList = candidateItemSet.getCandidateItemList();if (!candidateItemList.isEmpty()) {List<Integer> candidateItem = candidateItemList.get(0);int candidateItemlength = candidateItem.size();Integer[] candidateArray = new Integer[candidateItemlength];InFrequentItemsetBean inFrequentItemSet = new InFrequentItemsetBean();List<List<Integer>> inFrequentItemList = new ArrayList<List<Integer>>();// 用于存放每次取到的cell的內容的值String[] cellArray = new String[candidateItemlength];List<Cell[]> cellColumnList = new ArrayList<Cell[]>();// 將候選集的Excel的那幾列存為一個個數組,并將數組封裝在一個List里for (i = 0; i < candidateItemlength; i++) {Cell[] cell = new Cell[sheet.getRows()];cellColumnList.add(cell);}// 計數器int[] countArray = new int[candidateItemList.size()];// 計數器的初始化for (i = 0; i < countArray.length; i++) {countArray[i] = 0;}// 遍歷候選集for (i = 0; i < candidateItemList.size(); i++) {flag = true;// 候選集中的候選項下標candidateItem = candidateItemList.get(i);// 取出該候選項中所要比較的列,并保存到cellColumnList中for (j = 0; j < candidateItemlength; j++) {cellColumnList.set(j, sheet.getColumn(candidateItem.get(j)));}// 將該候選項里面存放的Integer數組的內容拿出來轉換為Integer數組for (j = 0; j < candidateItemlength; j++) {candidateArray[j] = candidateItem.get(j);}// 對比將要比較的列中的每一行是否都為true,如果都為true,則計數器進行計數for (j = 0; j < sheet.getRows(); j++) {flag = true;// 將候選項中的內容的值取出for (n = 0; n < candidateItemlength; n++) {Cell[] cell = cellColumnList.get(n);cellArray[n] = cell[j].getContents();}for (n = 0; n < candidateItemlength; n++) {if ((!cellArray[0].equals(cellArray[n])) || cellArray[0].equals("F")) {flag = false;break;}}if (flag) {countArray[i]++;}}}// 從候選集中篩選出頻繁項集和非頻繁項集for (i = 0; i < countArray.length; i++) {if (countArray[i] >= threshold) {frequentItemList.add(candidateItemList.get(i));} else {inFrequentItemList.add(candidateItemList.get(i));}}inFrequentItemSet.setInFrequentItemList(inFrequentItemList);frequentItemSet.setFrequentItemList(frequentItemList);dataBean.setInFrequentItemSet(inFrequentItemSet);dataBean.setFrequentItemSet(frequentItemSet);}return dataBean;}/*** 得到最大頻繁項集* @param dataBean* * @return 返回存放了最大頻繁項集的list*/public List<List<Integer>> getFrequentMaxItemset(DataBean dataBean) {FrequentItemsetBean frequentItemSet = dataBean.getFrequentItemSet();List<List<Integer>> frequentItemList = frequentItemSet.getFrequentItemList();// 當存在多個最大頻繁項集時,用list封裝List<List<Integer>> biggestItemList = new ArrayList<List<Integer>>();int max = 0;for (int i = 0; i < frequentItemList.size(); i++) {List<Integer> frequentItem = frequentItemList.get(i);if (frequentItem.size() > max) {max = frequentItem.size();}}for (Iterator<List<Integer>> iter = frequentItemList.iterator(); iter.hasNext();) {List<Integer> frequentItem = iter.next();if (frequentItem.size() == max) {biggestItemList.add(frequentItem);}}return biggestItemList;}/*** 運行Apriori算法*/public void startApriori() { // 文件名String filePath = "basketdata.xls";Workbook workbook = excelUtil.readExcel(filePath);// Excel文件要讀取的工作表位置int sheetLoca = 0; Sheet sheet = workbook.getSheet(sheetLoca);int wantLoca = 2; // 請輸入想獲得的表頭行位置(表頭行不存在則輸入-1)int initRowLoca = 3; // 請輸入要進行Apriori算法記錄的開始的行數int columnInitLoca = 2; // 請輸入要進行Apriori算法記錄的開始的列數(即流水號ID的下一列)//System.out.println("請輸入閾值:");Scanner scan = new Scanner(System.in);int threshold = scan.nextInt();// 閾值Cell[] headArray = excelUtil.getHeadInfo(workbook, sheetLoca, wantLoca);List<Cell[]> cellList = excelUtil.sheetEncapsulation(workbook, sheetLoca, initRowLoca);DataBean dataBean = getFrequentOneItemset(cellList, columnInitLoca, threshold);for (; !dataBean.getCandidateItemSet().getCandidateItemList().isEmpty();) {// 構造新的候選子集dataBean = createCandidateItemSet(dataBean);// 對候選子集進行剪枝dataBean = pruning(dataBean);// 得到頻繁-k項集dataBean = getFrequentKItemSet(dataBean, sheet, cellList, threshold, columnInitLoca);}// 打印頻繁項集的內容printUtil.printFrequentItemSetContent(dataBean.getFrequentItemSet(), headArray);// 得到最大頻繁項集List<List<Integer>> biggestFrequentItemSetList = getFrequentMaxItemset(dataBean);// 打印最大頻繁項集的內容printUtil.printBiggestFrequentItemSetContent(biggestFrequentItemSetList, headArray);scan.close();} }

1.8 Main.java

package com.devyy;public class Main {public static void main(String[] args) {Apriori apriori = new Apriori();apriori.startApriori();} }

2. 結果截圖

總結

以上是生活随笔為你收集整理的(精)广东工业大学 2018实时大数据分析——A-Priori算法实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。