From 09e2a7ebd95a67559b9dcc1caacca81dbda038a9 Mon Sep 17 00:00:00 2001 From: gadelrab Date: Tue, 26 Apr 2016 20:26:15 +0200 Subject: [PATCH] No order --- .../mpii/frequentrulesminning/Evaluator.java | 74 +++++++++++++------ .../utils/Transaction.java | 5 ++ .../utils/TransactionsDatabase.java | 11 +++ .../frequentrulesminning/utils/Weight.java | 5 ++ 4 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/mpii/frequentrulesminning/Evaluator.java b/src/main/java/de/mpii/frequentrulesminning/Evaluator.java index 8ef384a..8f1601e 100644 --- a/src/main/java/de/mpii/frequentrulesminning/Evaluator.java +++ b/src/main/java/de/mpii/frequentrulesminning/Evaluator.java @@ -75,10 +75,13 @@ public double confidence(AssocRuleWithExceptions rule, ExceptionItem exceptionIt Set ruleTransactions = transactionsDB.getTransactions(rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.countPrediction); Set bodyTransactions = transactionsDB.getTransactions(rule.getBody(), ExceptionItem.toArray(exceptionItem), this.countPrediction); - if (this.useOrder) { - ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); - bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); - } +// if (this.useOrder) { +// ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); +// bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); +// } + + ruleTransactions = filterTransactions(ruleTransactions, rule); + bodyTransactions = filterTransactions(bodyTransactions, rule); double bodySupport = TransactionsDatabase.getTransactionsCount(bodyTransactions, rule.getBody(), ExceptionItem.toArray(exceptionItem), this.useWeights); double ruleSupport = TransactionsDatabase.getTransactionsCount(ruleTransactions, rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.useWeights); @@ -102,10 +105,14 @@ public double coverage(AssocRuleWithExceptions rule, ExceptionItem exceptionItem Set ruleTransactions = transactionsDB.getTransactions(rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.countPrediction); Set headTransactions = transactionsDB.getTransactions(rule.getHead(), null, this.countPrediction); - if (this.useOrder) { - ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); - headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); - } +// if (this.useOrder) { +// ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); +// headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); +// } + + ruleTransactions = filterTransactions(ruleTransactions, rule); + headTransactions = filterTransactions(headTransactions, rule); + double ruleSupport = TransactionsDatabase.getTransactionsCount(ruleTransactions, rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.useWeights); double headSupport = TransactionsDatabase.getTransactionsCount(headTransactions, rule.getHead(), ExceptionItem.toArray(exceptionItem), this.useWeights); @@ -131,11 +138,17 @@ public double lift(AssocRuleWithExceptions rule, ExceptionItem exceptionItem) { Set bodyTransactions = transactionsDB.getTransactions(rule.getBody(), ExceptionItem.toArray(exceptionItem), this.countPrediction); Set headTransactions = transactionsDB.getTransactions(rule.getHead(), null, this.countPrediction); - if (this.useOrder) { - ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); - bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); - headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); - } +// if (this.useOrder) { +// ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); +// bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); +// headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); +// } + + + ruleTransactions = filterTransactions(ruleTransactions, rule); + bodyTransactions = filterTransactions(bodyTransactions, rule); + headTransactions = filterTransactions(headTransactions, rule); + double ruleSupport = TransactionsDatabase.getTransactionsCount(ruleTransactions, rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.useWeights); double bodySupport = TransactionsDatabase.getTransactionsCount(bodyTransactions, rule.getBody(), ExceptionItem.toArray(exceptionItem), this.useWeights); @@ -167,10 +180,13 @@ public double negativeRuleConfidence(AssocRuleWithExceptions rule, ExceptionItem Set ruleTransactions = transactionsDB.getTransactions(ArrayUtils.addAll(rule.getBody(), ExceptionItem.toArray(exceptionItem)), rule.getHead(), this.countPrediction); - if (this.useOrder) { - ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); - bodyWithExceptionTransactions = TransactionsDatabase.filterBetterQualityRules(bodyWithExceptionTransactions, rule); - } +// if (this.useOrder) { +// ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); +// bodyWithExceptionTransactions = TransactionsDatabase.filterBetterQualityRules(bodyWithExceptionTransactions, rule); +// } + ruleTransactions = filterTransactions(ruleTransactions, rule); + bodyWithExceptionTransactions = filterTransactions(bodyWithExceptionTransactions, rule); + double ruleSupport = TransactionsDatabase.getTransactionsCount(ruleTransactions, ArrayUtils.addAll(rule.getBody(), ExceptionItem.toArray(exceptionItem)), rule.getHead(), this.useWeights); double bodySupport = TransactionsDatabase.getTransactionsCount(bodyWithExceptionTransactions, ArrayUtils.addAll(rule.getBody(), ExceptionItem.toArray(exceptionItem)), null, this.useWeights); @@ -179,6 +195,16 @@ public double negativeRuleConfidence(AssocRuleWithExceptions rule, ExceptionItem } + private Set filterTransactions(Set transactions, AssocRuleWithExceptions rule) { + if(useOrder){ + transactions=TransactionsDatabase.filterBetterQualityRules(transactions, rule); + } + else{ + transactions= TransactionsDatabase.filterOtherRulesPredictions(transactions, rule); + } + return transactions; + } + public void setCountPrediction(boolean countPrediction) { this.countPrediction = countPrediction; @@ -227,11 +253,15 @@ public double JaccardCoefficient(AssocRuleWithExceptions rule,ExceptionItem exce Set bodyTransactions = transactionsDB.getTransactions(rule.getBody(), ExceptionItem.toArray(exceptionItem), this.countPrediction); Set headTransactions = transactionsDB.getTransactions(rule.getHead(), null, this.countPrediction); - if (this.useOrder) { - ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); - bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); - headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); - } +// if (this.useOrder) { +// ruleTransactions = TransactionsDatabase.filterBetterQualityRules(ruleTransactions, rule); +// bodyTransactions = TransactionsDatabase.filterBetterQualityRules(bodyTransactions, rule); +// headTransactions = TransactionsDatabase.filterBetterQualityRules(headTransactions, rule); +// } + + ruleTransactions = filterTransactions(ruleTransactions, rule); + bodyTransactions = filterTransactions(bodyTransactions, rule); + headTransactions =filterTransactions(headTransactions, rule); double ruleSupport = TransactionsDatabase.getTransactionsCount(ruleTransactions, rule.getBodyAndHead(), ExceptionItem.toArray(exceptionItem), this.useWeights); double bodySupport = TransactionsDatabase.getTransactionsCount(bodyTransactions, rule.getBody(), ExceptionItem.toArray(exceptionItem), this.useWeights); diff --git a/src/main/java/de/mpii/frequentrulesminning/utils/Transaction.java b/src/main/java/de/mpii/frequentrulesminning/utils/Transaction.java index cc2799e..260c7d5 100644 --- a/src/main/java/de/mpii/frequentrulesminning/utils/Transaction.java +++ b/src/main/java/de/mpii/frequentrulesminning/utils/Transaction.java @@ -237,4 +237,9 @@ public boolean allPredictionsFromBetterQualityRules(AssocRuleWithExceptions rule return Arrays.stream(rule.getBody()).allMatch((i)->getItemWeight(i).predictedWithBetterQualityRules(rule)); } + + + public boolean allPredicationFromDifferentRules(AssocRuleWithExceptions rule){ + return Arrays.stream(rule.getBody()).allMatch((i)->getItemWeight(i).predictedWithDifferentRules(rule)); + } } \ No newline at end of file diff --git a/src/main/java/de/mpii/frequentrulesminning/utils/TransactionsDatabase.java b/src/main/java/de/mpii/frequentrulesminning/utils/TransactionsDatabase.java index 9e8f8f2..14e2a22 100644 --- a/src/main/java/de/mpii/frequentrulesminning/utils/TransactionsDatabase.java +++ b/src/main/java/de/mpii/frequentrulesminning/utils/TransactionsDatabase.java @@ -61,6 +61,17 @@ public static Set filterBetterQualityRules(Collection return transactions.stream().filter((t)-> t.allPredictionsFromBetterQualityRules(rule)).collect(Collectors.toSet()); } + /** + * Keep the transactions to only those generated with other rules + * @param transactions + * @param rule + * @return + */ + public static Set filterOtherRulesPredictions(Collection transactions,AssocRuleWithExceptions rule){ + // Restrict on transactions of higher quality + return transactions.stream().filter((t)-> t.allPredicationFromDifferentRules(rule)).collect(Collectors.toSet()); + } + /** * Return the transactions total count either nor weighted or weighted with respect to set of Items positive and negatives * @param transactions diff --git a/src/main/java/de/mpii/frequentrulesminning/utils/Weight.java b/src/main/java/de/mpii/frequentrulesminning/utils/Weight.java index 8a5ebab..1aa5ac0 100644 --- a/src/main/java/de/mpii/frequentrulesminning/utils/Weight.java +++ b/src/main/java/de/mpii/frequentrulesminning/utils/Weight.java @@ -82,4 +82,9 @@ public double getMinimumRulesChainQuality() { // Currently only one rule return this.getRuleQuality(); } + + public boolean predictedWithDifferentRules(AssocRuleWithExceptions rule) { + return !rulesChainContains(rule); + + } }