class DataMining::Apriori

Apriori Algorithm for frequent set mining and association rule learning

Attributes

results[R]

Find frequent item sets

Arguments:

transactions: (array of arrays, like [[:id, [transactions]] .. ])
minimum_support: (integer)

Public Class Methods

new(transactions, minimum_support) click to toggle source
# File lib/data_mining/apriori.rb, line 11
def initialize(transactions, minimum_support)
  @transactions = transactions.select(&:flatten!).each(&:shift)
  @min_support  = minimum_support
  @results      = []
end

Public Instance Methods

item_sets_size(size) click to toggle source
# File lib/data_mining/apriori.rb, line 21
def item_sets_size(size)
  @results[size - 1]
end
mine!() click to toggle source
# File lib/data_mining/apriori.rb, line 17
def mine!
  apriori
end

Private Instance Methods

apriori() click to toggle source
# File lib/data_mining/apriori.rb, line 27
def apriori
  @results << starting_set
  @results << next_set(@results.last) until @results.last.empty?
end
frequent_items() click to toggle source
# File lib/data_mining/apriori.rb, line 36
def frequent_items
  @transactions.each_with_object(Hash.new(0)) do |sets, hash|
    sets.each { |item| hash[item] += 1 }
  end
end
next_set(itemsets) click to toggle source
# File lib/data_mining/apriori.rb, line 42
def next_set(itemsets)
  itemsets.each_with_object([]) do |set, arr|
    possible_candidates(set, itemsets).each do |candidate|
      arr << candidate if satisfies_min_sup(candidate)
    end
  end
end
possible_candidates(itemset, itemsets) click to toggle source
# File lib/data_mining/apriori.rb, line 50
def possible_candidates(itemset, itemsets)
  itemsets.each_with_object([]) do |set, arr|
    arr << (itemset + [set.last]) if set.last > itemset.last
  end.uniq
end
satisfies_min_sup(candidate) click to toggle source
# File lib/data_mining/apriori.rb, line 56
def satisfies_min_sup(candidate)
  return true if (@transactions.inject(0) do |counter, entry|
    counter += 1 if (candidate - entry).empty?
    counter
  end >= @min_support)
  false
end
starting_set() click to toggle source
# File lib/data_mining/apriori.rb, line 32
def starting_set
  frequent_items.reject { |_, v| v < @min_support }.keys.sort.map { |i| [i] }
end