예제 #1
0
  // 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;
  }