// The Apriori Algorithm private static List<Itemset> apriori(List<Transaction> transactions, double minsup) { if (transactions.isEmpty()) { return null; } // Generate frequent 1-itemset List<Integer> occurancesOfItems = new ArrayList<>(); for (int i = 0; i != transactions.get(0).getNumOfTotalItems(); ++i) { occurancesOfItems.add(0); } for (Transaction transaction : transactions) { for (int index : transaction.items()) { occurancesOfItems.set(index, occurancesOfItems.get(index) + 1); } } int numOfTransactions = transactions.size(); List<Itemset> frequentOneItemsets = new ArrayList<>(); for (int i = 0; i != occurancesOfItems.size(); ++i) { if ((double) occurancesOfItems.get(i) / numOfTransactions >= minsup) { Itemset itemset = new Itemset(i); frequentOneItemsets.add(itemset); } } // A list of itemsets to store the frequent k-itemsets, k = 1, 2, ... List<List<Itemset>> listOfFrequentItemsets = new ArrayList<List<Itemset>>(); listOfFrequentItemsets.add( new ArrayList<Itemset>()); // case: k = 0, we fill it with an empty itemsets listOfFrequentItemsets.add(frequentOneItemsets); // case: k = 1 List<Itemset> prunedCandidates; List<Itemset> frequentItemsets; int k = 1; while ((frequentItemsets = listOfFrequentItemsets.get(k)) != null) { List<Itemset> newCandidates = generateCandidates(frequentItemsets); prunedCandidates = prune(newCandidates, frequentItemsets); List<Itemset> candidates = determineFrequentItemsets(prunedCandidates, transactions, minsup); listOfFrequentItemsets.add(candidates); k++; } // Union the frequent itemsets as result List<Itemset> result = new ArrayList<>(); for (List<Itemset> list : listOfFrequentItemsets) { if (list != null) { result.addAll(list); } } return result; }