The Kai Way

Pragmaticly hacking

Apriori算法的Ruby实现

| Comments

Apriori的算法实现,上课用到了。老师从网上找了一个300多行代码的Ruby实现,太复杂了,改了一下,太麻烦,自己重写过。

下面是实现代码

#!/usr/bin/ruby -w
# Apriori 算法实现

class Apriori
  attr_accessor :date_set, :min_sup, :lv1_item_set

  # 从指定文件中得到整个事务集
  def get_data_set(input_file)
    raise "Error: File #{input_file} does not exist" unless File.exists?(input_file)
    content = ''
    open(input_file) {|f| content = f.read}
    content.inject([]) {|set, l| set <= item.size
      @lv1_item_set.each do |i1| # 第一级项集
        if (item | i1).size > item.size && intersection?(date, (item | i1))
          candidacy_set.push((item | i1).sort).uniq!  # 候选集生成
        end
      end
    end
    candidacy_set.sort
  end

  # 从候选集产生频繁集
  def create_frequent_item_set(candidacy_set)
    frequent_item_set = Hash.new(0)
    candidacy_set.each do |e|
      @date_set.each { |date| frequent_item_set[e] += 1 if intersection?(date, e)}
    end
    return frequent_item_set.delete_if {|k, v| v = @min_sup }
    # 输出第一级项集
    open(output_file, "w") do |f|
      @lv1_item_set.each { |e| f.puts e + " : " + @hash[e].to_s }
    end
    # 迭代生成候选集
    result = []
    until(result.empty?) do
      # ......
    end
  end
end