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