Skip to content

Commit

Permalink
fixed major bug with assoc rule mining. refs #1
Browse files Browse the repository at this point in the history
  • Loading branch information
bartdag committed Aug 10, 2015
1 parent a7a5696 commit b71eb40
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
14 changes: 7 additions & 7 deletions pymining/assocrules.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ def mine_assoc_rules(isets, min_support=2, min_confidence=0.5):
continue

for item in key:
left = frozenset([item])
right = key.difference([item])
left = key.difference([item])
right = frozenset([item])
_mine_assoc_rules(left, right, support, visited, isets,
min_support, min_confidence, rules)

Expand All @@ -17,7 +17,7 @@ def mine_assoc_rules(isets, min_support=2, min_confidence=0.5):

def _mine_assoc_rules(left, right, rule_support, visited, isets, min_support,
min_confidence, rules):
if (left, right) in visited or len(right) < 1:
if (left, right) in visited or len(left) < 1:
return
else:
visited.add((left, right))
Expand All @@ -26,9 +26,9 @@ def _mine_assoc_rules(left, right, rule_support, visited, isets, min_support,
confidence = float(rule_support) / float(support_a)
if confidence >= min_confidence:
rules.append((left, right, rule_support, confidence))
# We can try to increase left!
for item in right:
new_left = left.union([item])
new_right = right.difference([item])
# We can try to increase right!
for item in left:
new_left = left.difference([item])
new_right = right.union([item])
_mine_assoc_rules(new_left, new_right, rule_support, visited, isets,
min_support, min_confidence, rules)
20 changes: 17 additions & 3 deletions tests/assocrules_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def testDefaultSupportConf(self):
relim_input = itemmining.get_relim_input(ts1)
report = itemmining.relim(relim_input, 2)
rules = assocrules.mine_assoc_rules(report, min_support=2)
self.assertEqual(20, len(rules))
self.assertEqual(23, len(rules))

a_rule = (frozenset(['b', 'e']), frozenset(['d']), 2, 1.0)
self.assertTrue(a_rule in rules)
Expand All @@ -17,7 +17,7 @@ def testDefaultSupportConf(self):
relim_input = itemmining.get_relim_input(ts2)
report = itemmining.relim(relim_input, 2)
rules = assocrules.mine_assoc_rules(report, min_support=2)
self.assertEqual(20, len(rules))
self.assertEqual(29, len(rules))

a_rule = (frozenset(['e']), frozenset(['a', 'd']), 2, 2.0/3.0)
self.assertTrue(a_rule in rules)
Expand All @@ -28,7 +28,7 @@ def testConfidence075(self):
report = itemmining.relim(relim_input, 2)
rules = assocrules.mine_assoc_rules(report, min_support=2,
min_confidence=0.75)
self.assertEqual(5, len(rules))
self.assertEqual(8, len(rules))

a_rule = (frozenset(['b']), frozenset(['d']), 6, 0.75)
self.assertTrue(a_rule in rules)
Expand All @@ -42,3 +42,17 @@ def testSupport5(self):

a_rule = (frozenset(['d']), frozenset(['b']), 6, 0.75)
self.assertTrue(a_rule in rules)

def testConfidenceForComplexRules(self):
transab = (('a', 'b'), ) * 1000
transac = (('a', 'c'), ) * 1000
transabc = (('a', 'b', 'c'), ) * 5
trans = transab + transac + transabc
relim_input = itemmining.get_relim_input(trans)
report = itemmining.relim(relim_input, 5)
rules = assocrules.mine_assoc_rules(
report, min_support=5, min_confidence=0.9)
self.assertEqual(3, len(rules))

a_rule = (frozenset(['b', 'c']), frozenset(['a']), 5, 1.0)
self.assertTrue(a_rule in rules)

0 comments on commit b71eb40

Please sign in to comment.