Class: Apriori::Algorithm

Inherits:
Object
  • Object
show all
Defined in:
lib/apriori/algorithm.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(min_support = 0.15, min_confidence = 0.6) ⇒ Algorithm

Returns a new instance of Algorithm.



14
15
16
17
# File 'lib/apriori/algorithm.rb', line 14

def initialize(min_support = 0.15, min_confidence = 0.6)
  @min_support = min_support
  @min_confidence = min_confidence
end

Instance Attribute Details

#min_confidenceObject (readonly)

Returns the value of attribute min_confidence.



12
13
14
# File 'lib/apriori/algorithm.rb', line 12

def min_confidence
  @min_confidence
end

#min_supportObject (readonly)

Returns the value of attribute min_support.



12
13
14
# File 'lib/apriori/algorithm.rb', line 12

def min_support
  @min_support
end

Instance Method Details

#analyze(transactions) ⇒ Object

transactions: string[]



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/apriori/algorithm.rb', line 20

def analyze(transactions) # AnalysisResult
  frequencies = {} # {item_set: count}
  frequent_item_sets = {} # {item_set_size: FrequentItemSet[]}

  one_element_item_sets = to_one_element_item_sets(transactions) # string[][]
  one_c_item_sets = find_item_sets_min_support_satisfied(
      one_element_item_sets, transactions, min_support, frequencies) # FrequentItemSet[]

  current_l_item_sets = one_c_item_sets # FrequentItemSet[]
  item_set_size = 1
  while current_l_item_sets.length != 0
    frequent_item_sets[item_set_size] = current_l_item_sets
    joined_sets = to_fixed_size_joined_sets(current_l_item_sets.map { |_| _.item_set }, item_set_size + 1)
    current_l_item_sets = find_item_sets_min_support_satisfied(joined_sets, transactions, min_support, frequencies)
    item_set_size += 1
  end

  found_sub_sets = [] # string[][]
  association_rules = [] # AssociationRule[]
  frequent_item_sets.each do |item_set_size, item_sets|
    item_sets = item_sets.map { |_| _.item_set }
    next if item_sets.length == 0 || item_sets[0].length <= 1

    item_sets.each do |item_set|
      to_all_sub_sets(item_set).each do |subset_item_set|
        diff_item_set = ((item_set - subset_item_set) + (subset_item_set - item_set)).uniq
        if diff_item_set.length > 0
          item_support = calculate_support(item_set, frequencies, transactions)
          subset_support = calculate_support(subset_item_set, frequencies, transactions)
          confidence = item_support / subset_support
          if !is_the_rule_already_found(found_sub_sets, subset_item_set) && confidence >= min_confidence
            found_sub_sets << subset_item_set
            association_rules << Apriori::AssociationRule.new(subset_item_set, diff_item_set, confidence)
          end
        end
      end
    end
  end

  Apriori::AnalysisResult.new(frequent_item_sets, association_rules)
end