apriori 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/History.txt +16 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +121 -0
  4. data/README.txt +149 -0
  5. data/Rakefile +15 -0
  6. data/TODO.txt +60 -0
  7. data/attic/c_ext_test1/MyTest/MyTest.c +23 -0
  8. data/attic/c_ext_test1/MyTest/extconf.rb +11 -0
  9. data/attic/c_ext_test1/mytest.rb +10 -0
  10. data/attic/test.c +12 -0
  11. data/config/hoe.rb +81 -0
  12. data/config/requirements.rb +29 -0
  13. data/examples/01_simple_example.rb +32 -0
  14. data/examples/02_small_file_example.rb +17 -0
  15. data/examples/03_large_file_example.rb +22 -0
  16. data/examples/test_data/market_basket_basic_test.dat +9 -0
  17. data/ext/Apriori.c +149 -0
  18. data/ext/Makefile +149 -0
  19. data/ext/apriori/doc/apriori.html +1301 -0
  20. data/ext/apriori/doc/arem.gp +68 -0
  21. data/ext/apriori/doc/c_rev.gp +89 -0
  22. data/ext/apriori/doc/chi2.tex +156 -0
  23. data/ext/apriori/doc/copying +504 -0
  24. data/ext/apriori/doc/line.gif +0 -0
  25. data/ext/apriori/doc/uparrow.gif +0 -0
  26. data/ext/apriori/ex/flg2set +15 -0
  27. data/ext/apriori/ex/hdr2set +13 -0
  28. data/ext/apriori/ex/readme +71 -0
  29. data/ext/apriori/ex/row2set +7 -0
  30. data/ext/apriori/ex/rulesort +24 -0
  31. data/ext/apriori/ex/tab2set +9 -0
  32. data/ext/apriori/ex/test.app +2 -0
  33. data/ext/apriori/ex/test.rul +9 -0
  34. data/ext/apriori/ex/test1.rul +43 -0
  35. data/ext/apriori/ex/test1.tab +10 -0
  36. data/ext/apriori/ex/test2.tab +10 -0
  37. data/ext/apriori/ex/test3.tab +30 -0
  38. data/ext/apriori/ex/test4.tab +11 -0
  39. data/ext/apriori/ex/test5.tab +39 -0
  40. data/ext/apriori/ex/tid2set +23 -0
  41. data/ext/apriori/ex/xhdr2set +33 -0
  42. data/ext/apriori/src/apriori.c +750 -0
  43. data/ext/apriori/src/apriori.dsp +120 -0
  44. data/ext/apriori/src/apriori.dsw +29 -0
  45. data/ext/apriori/src/apriori.mak +99 -0
  46. data/ext/apriori/src/istree.c +1411 -0
  47. data/ext/apriori/src/istree.h +160 -0
  48. data/ext/apriori/src/makefile +105 -0
  49. data/ext/apriori/src/tract.c +870 -0
  50. data/ext/apriori/src/tract.h +261 -0
  51. data/ext/apriori_wrapper.c +757 -0
  52. data/ext/apriori_wrapper.h +10 -0
  53. data/ext/extconf.rb +32 -0
  54. data/ext/math/doc/copying +504 -0
  55. data/ext/math/src/chi2.c +151 -0
  56. data/ext/math/src/chi2.h +27 -0
  57. data/ext/math/src/choose.c +71 -0
  58. data/ext/math/src/choose.h +16 -0
  59. data/ext/math/src/gamma.c +446 -0
  60. data/ext/math/src/gamma.h +39 -0
  61. data/ext/math/src/intexp.c +35 -0
  62. data/ext/math/src/intexp.h +15 -0
  63. data/ext/math/src/makefile +164 -0
  64. data/ext/math/src/math.mak +48 -0
  65. data/ext/math/src/normal.c +387 -0
  66. data/ext/math/src/normal.h +44 -0
  67. data/ext/math/src/radfn.c +113 -0
  68. data/ext/math/src/radfn.h +34 -0
  69. data/ext/math/src/zeta.c +49 -0
  70. data/ext/math/src/zeta.h +15 -0
  71. data/ext/pre-clean.rb +8 -0
  72. data/ext/pre-setup.rb +9 -0
  73. data/ext/util/doc/copying +504 -0
  74. data/ext/util/src/listops.c +76 -0
  75. data/ext/util/src/listops.h +26 -0
  76. data/ext/util/src/makefile +103 -0
  77. data/ext/util/src/memsys.c +84 -0
  78. data/ext/util/src/memsys.h +42 -0
  79. data/ext/util/src/nstats.c +288 -0
  80. data/ext/util/src/nstats.h +69 -0
  81. data/ext/util/src/params.c +86 -0
  82. data/ext/util/src/params.h +19 -0
  83. data/ext/util/src/parse.c +133 -0
  84. data/ext/util/src/parse.h +81 -0
  85. data/ext/util/src/scan.c +767 -0
  86. data/ext/util/src/scan.h +111 -0
  87. data/ext/util/src/symtab.c +443 -0
  88. data/ext/util/src/symtab.h +121 -0
  89. data/ext/util/src/tabscan.c +279 -0
  90. data/ext/util/src/tabscan.h +99 -0
  91. data/ext/util/src/util.mak +91 -0
  92. data/ext/util/src/vecops.c +317 -0
  93. data/ext/util/src/vecops.h +42 -0
  94. data/lib/apriori.rb +133 -0
  95. data/lib/apriori/adapter.rb +13 -0
  96. data/lib/apriori/association_rule.rb +89 -0
  97. data/lib/apriori/version.rb +9 -0
  98. data/script/console +10 -0
  99. data/script/destroy +14 -0
  100. data/script/generate +14 -0
  101. data/script/txt2html +82 -0
  102. data/setup.rb +1585 -0
  103. data/tasks/apriori.rake +20 -0
  104. data/tasks/attic.rake +28 -0
  105. data/tasks/deployment.rake +34 -0
  106. data/tasks/environment.rake +7 -0
  107. data/tasks/install.rake +13 -0
  108. data/tasks/website.rake +17 -0
  109. data/test/apriori_test.rb +13 -0
  110. data/test/fixtures/market_basket_results_test.txt +5 -0
  111. data/test/fixtures/market_basket_string_test.txt +7 -0
  112. data/test/fixtures/results.txt +2 -0
  113. data/test/fixtures/sample.txt +7 -0
  114. data/test/test_helper.rb +5 -0
  115. data/test/unit/test_apriori.rb +68 -0
  116. data/test/unit/test_itemsets_and_parsing.rb +82 -0
  117. data/website/index.html +248 -0
  118. data/website/index.txt +152 -0
  119. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  120. data/website/stylesheets/screen.css +142 -0
  121. data/website/template.html.erb +49 -0
  122. metadata +226 -0
@@ -0,0 +1,20 @@
1
+ namespace :apriori do
2
+ desc "Download the example data"
3
+ task :get_example_data do
4
+ puts <<-EOF
5
+ Sorry! This isn't implemented in a portable way just yet.
6
+ If you're on a *nix system try:
7
+
8
+ curl -0 http://fimi.cs.helsinki.fi/data/kosarak.dat > examples/test_data/kosarak.dat
9
+ curl -0 http://fimi.cs.helsinki.fi/data/retail.dat > examples/test_data/retail.dat
10
+
11
+ Patches welcome! (http://github.com/jashmenn/apriori/tree/master)
12
+ EOF
13
+
14
+ # open("http://www.ruby-lang.org/") {|f|
15
+ # f.each_line {|line| p line}
16
+ # }
17
+ # }
18
+
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # This task is not actually used.
2
+ # Use "ruby setup.rb" instead.
3
+ # This task is just here to show you the idea of what is going on
4
+ ext_base = File.join(File.dirname(__FILE__), "ext")
5
+ task "get_it_done" do
6
+ sh "
7
+ pushd #{ext_base}/util/src/;
8
+ rm *.o
9
+ make;
10
+ popd;
11
+ pushd #{ext_base}/math/src;
12
+ rm *.o
13
+ # dont need to make this
14
+ popd;
15
+ pushd #{ext_base}/apriori/src/;
16
+ rm *.o;
17
+ make;
18
+ popd;
19
+ pushd #{ext_base};
20
+ rm *.o;
21
+ rm *.bundle;
22
+ rm Makefile;
23
+ ruby extconf.rb;
24
+ make;
25
+ popd;
26
+ ruby -d test/apriori_test.rb;
27
+ "
28
+ end
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,13 @@
1
+ task :extension do
2
+ # just compile the extension, dont do a typical setup.rb install
3
+ sh "ruby setup.rb clean"
4
+ sh "ruby setup.rb config"
5
+ sh "ruby setup.rb setup"
6
+ end
7
+
8
+ namespace :github do
9
+ desc "Generate the Gemspec for github"
10
+ task :generate_gemspec do
11
+ sh "rake --silent debug_gem > apriori.gemspec"
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,13 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'apriori'; include Apriori; puts do_apriori(["apriori", "test/fixtures/sample.txt", "test/fixtures/results.txt"])
3
+ puts
4
+ puts
5
+ puts
6
+ # puts test_hash_ap("one", "two", :hello => "world")
7
+ # puts do_apriori
8
+ #puts find_association_rules("one", "two", :hello => "world")
9
+
10
+ # ruby -r 'Apriori/apriori' -e 'include Apriori; puts test_converting_array(["apriori", "test/sample.txt", "test/results.txt"])'
11
+ # puts test1
12
+ # => 10
13
+ # pp help
@@ -0,0 +1,5 @@
1
+ doritos <- beer (33.3/2, 100.0)
2
+ apple <- doritos (50.0/3, 33.3)
3
+ cheese <- apple (66.7/4, 75.0)
4
+ foo <- bar baz (66.7/4, 75.0)
5
+ foo <- bar baz bangle (66.7/4, 75.0)
@@ -0,0 +1,7 @@
1
+ apple
2
+ beer doritos
3
+ apple cheese
4
+ beer doritos
5
+ apple cheese
6
+ apple cheese
7
+ apple doritos
@@ -0,0 +1,2 @@
1
+ 4 <- 2 (28.6, 100.0)
2
+ 1 <- 3 (42.9, 100.0)
@@ -0,0 +1,7 @@
1
+ 1
2
+ 2 4
3
+ 1 3
4
+ 2 4
5
+ 1 3
6
+ 1 3
7
+ 1 4
@@ -0,0 +1,5 @@
1
+ require 'test/unit'
2
+ require 'pp'
3
+ require File.dirname(__FILE__) + '/../lib/apriori'
4
+
5
+ FIXTURES_DIR = File.expand_path(File.dirname(__FILE__) + "/fixtures")
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ class TestApriori < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ # require 'apriori'; include Apriori; puts do_apriori(["apriori", "test/fixtures/sample.txt", "test/fixtures/results.txt"])
9
+
10
+ def test_truth
11
+ input = File.join(FIXTURES_DIR + "/market_basket_string_test.txt")
12
+ assert rules = Apriori.find_association_rules(input)
13
+ end
14
+
15
+ def test_calling_all_the_options
16
+ input = File.join(FIXTURES_DIR + "/market_basket_string_test.txt")
17
+ assert rules = Apriori.find_association_rules(input,
18
+ :min_items => 2,
19
+ :max_items => 5,
20
+ :min_support => 1,
21
+ :max_support => 100,
22
+ :min_confidence => 20)
23
+ end
24
+
25
+ def test_giving_the_transactions
26
+ transactions = [ %w{beer doritos},
27
+ %w{apple cheese},
28
+ %w{beer doritos},
29
+ %w{apple cheese},
30
+ %w{apple cheese},
31
+ %w{apple doritos} ]
32
+
33
+ rules = Apriori.find_association_rules(transactions,
34
+ :min_items => 2,
35
+ :max_items => 5,
36
+ :min_support => 1,
37
+ :max_support => 100,
38
+ :min_confidence => 20)
39
+
40
+ assert is = Apriori::AssociationRule.parse_line("apple <- cheese (50.0/3, 100.0)")
41
+ assert rules.include?(is)
42
+
43
+ # puts rules.join("\n")
44
+ end
45
+
46
+ def test_returning_no_results
47
+ # currently the application exits. thats no good! just give a message
48
+ transactions = [ %w{beer doritos},
49
+ %w{apple cheese},
50
+ %w{beer doritos},
51
+ %w{apple cheese},
52
+ %w{apple cheese},
53
+ %w{apple doritos} ]
54
+
55
+ # crazy numbers that will never return any rules
56
+ rules = Apriori.find_association_rules(transactions,
57
+ :min_items => 5,
58
+ :max_items => 5,
59
+ :min_support => 100,
60
+ :max_support => 100,
61
+ :min_confidence => 20)
62
+
63
+ assert_equal 0, rules.size
64
+
65
+ # also, make notes that if you get more rules, a common thing to do is to reduce the min_support to a very small float
66
+ end
67
+
68
+ end
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ class TestAssociationRulesAndParsingApriori < Test::Unit::TestCase
4
+ include Apriori
5
+
6
+ def setup
7
+ end
8
+
9
+ def test_reading_from_a_file
10
+ input = File.join(FIXTURES_DIR + "/market_basket_results_test.txt")
11
+ assert rules = AssociationRule.from_file(input)
12
+ assert_equal 5, rules.size
13
+
14
+ assert is = AssociationRule.parse_line("apple <- doritos (50.0/3, 33.3)")
15
+ assert rules.include?(is)
16
+ assert is = AssociationRule.parse_line("foo <- bar baz bangle (66.7/4, 75.0)")
17
+ assert rules.include?(is)
18
+ end
19
+
20
+ def test_parsing_individual_lines
21
+ assert is = AssociationRule.parse_line("doritos <- beer (33.3/2, 100.0)")
22
+ wanted = {
23
+ :consequent => "doritos",
24
+ :antecedent => ["beer"],
25
+ :support => 33.3,
26
+ :num_antecedent_transactions => 2,
27
+ :confidence => 100.0,
28
+ }
29
+ wanted.each do |key,value|
30
+ assert_equal value, is.send(key), "Expected itemset '#{key}' to be '#{value}'"
31
+ end
32
+ assert_equal "doritos <- beer (33.3/2, 100.0)", is.to_s
33
+
34
+ assert is = AssociationRule.parse_line("apple <- doritos (50.0/3, 33.3)")
35
+ wanted = {
36
+ :consequent => "apple",
37
+ :antecedent => ["doritos"],
38
+ :support => 50.0,
39
+ :num_antecedent_transactions => 3,
40
+ :confidence => 33.3,
41
+ }
42
+ wanted.each do |key,value|
43
+ assert_equal value, is.send(key), "Expected itemset '#{key}' to be '#{value}'"
44
+ end
45
+ assert_equal "apple <- doritos (50.0/3, 33.3)", is.to_s
46
+
47
+ assert is = AssociationRule.parse_line("foo <- bar baz (66.7, 75.0)")
48
+ wanted = {
49
+ :consequent => "foo",
50
+ :antecedent => ["bar", "baz"],
51
+ :support => 66.7,
52
+ :num_antecedent_transactions => nil,
53
+ :confidence => 75.0,
54
+ }
55
+ wanted.each do |key,value|
56
+ assert_equal value, is.send(key), "Expected itemset '#{key}' to be '#{value}'"
57
+ end
58
+ assert_equal "foo <- bar baz (66.7, 75.0)", is.to_s
59
+
60
+ # foo <- bar baz bangle (66.7/4, 75.0)
61
+ assert is = AssociationRule.parse_line("foo <- bar baz bangle (66.7/4, 75.0)")
62
+ wanted = {
63
+ :consequent => "foo",
64
+ :antecedent => ["bar", "baz", "bangle"],
65
+ :support => 66.7,
66
+ :num_antecedent_transactions => 4,
67
+ :confidence => 75.0,
68
+ }
69
+ wanted.each do |key,value|
70
+ assert_equal value, is.send(key), "Expected itemset '#{key}' to be '#{value}'"
71
+ end
72
+ assert_equal "foo <- bar baz bangle (66.7/4, 75.0)", is.to_s
73
+ end
74
+
75
+ def test_association_rule_equality
76
+ assert is = AssociationRule.parse_line("doritos <- beer (33.3/2, 100.0)")
77
+ assert is2 = AssociationRule.parse_line("doritos <- beer (33.3/2, 100.0)")
78
+ assert_equal is, is2
79
+ end
80
+
81
+
82
+ end
@@ -0,0 +1,248 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ apriori
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>apriori</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/apriori"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/apriori" class="numbers">0.2.1</a>
37
+ <img src="images/2118201782_4e87521dc9_m.jpg" />
38
+ </div>
39
+ <h1>&#x2192; &#8216;find item associations&#8217;</h1>
40
+
41
+
42
+ <h2>What</h2>
43
+
44
+
45
+ <p>Ruby Apriori is a library to efficiently find item association rules within
46
+ large sets of transactions. This library provides a Ruby interface to Christian
47
+ Borgelt&#8217;s C implementation of this algorithm.</p>
48
+
49
+
50
+ <p>From Christian Borgelt&#8217;s Apriori:http://www.borgelt.net/apriori.html documentation:</p>
51
+
52
+
53
+ <blockquote>
54
+ <p>Association rule induction is a powerful method for so-called market basket
55
+ analysis, which aims at finding regularities in the shopping behavior of
56
+ customers.</p>
57
+ </blockquote>
58
+
59
+
60
+ <blockquote>
61
+ <p>With the induction of association rules one tries to find sets of
62
+ products that are frequently bought together, so that from the presence of
63
+ certain products in a shopping cart one can infer (with a high probability)
64
+ that certain other products are present.</p>
65
+ </blockquote>
66
+
67
+
68
+ <blockquote>
69
+ <p>An association rule is a rule like &#8220;If a customer buys wine and bread, he often
70
+ buys cheese, too.&#8221;</p>
71
+ </blockquote>
72
+
73
+
74
+ <blockquote>
75
+ <p>An association rule states that if we pick a customer at random and find out
76
+ that he selected certain items (bought certain products, chose certain options
77
+ etc.), we can be confident, quantified by a percentage, that he also selected
78
+ certain other items (bought certain other products, chose certain other options
79
+ etc.).</p>
80
+ </blockquote>
81
+
82
+
83
+ <p>This Ruby library provides a convenient way to use this algorithm from Ruby.</p>
84
+
85
+
86
+ <p>Original Apriori C code by Christian Borgelt.</p>
87
+
88
+
89
+ <h2>Installing</h2>
90
+
91
+
92
+ <p><pre class='syntax'><span class="ident">gem</span> <span class="ident">install</span> <span class="punct">--</span><span class="ident">source</span> <span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">gems</span><span class="punct">.</span><span class="ident">github</span><span class="punct">.</span><span class="ident">com</span> <span class="ident">jashmenn</span><span class="punct">-</span><span class="ident">apriori</span></pre></p>
93
+
94
+
95
+ <h2>The Algorithm:</h2>
96
+
97
+
98
+ <p>This document is not an introduction to the Apriori algorithm. To find out more about Apriori see:</p>
99
+
100
+
101
+ <ul>
102
+ <li><a href="http://www.borgelt.net/papers/cstat_02.pdf">http://www.borgelt.net/papers/cstat_02.pdf</a></li>
103
+ <li><a href="http://www.borgelt.net/papers/fimi_03.pdf">http://www.borgelt.net/papers/fimi_03.pdf</a></li>
104
+ <li><a href="http://www.borgelt.net/apriori.html">http://www.borgelt.net/apriori.html</a></li>
105
+ <li><a href="http://en.wikipedia.org/wiki/Apriori_algorithm">http://en.wikipedia.org/wiki/Apriori_algorithm</a></li>
106
+ </ul>
107
+
108
+
109
+ <h2>Demonstration of usage</h2>
110
+
111
+
112
+ <p><pre class='syntax'>
113
+ <span class="ident">require</span> <span class="punct">'</span><span class="string">apriori</span><span class="punct">'</span>
114
+
115
+ <span class="ident">transactions</span> <span class="punct">=</span> <span class="punct">[</span> <span class="punct">%w{</span><span class="string">beer doritos</span><span class="punct">},</span>
116
+ <span class="punct">%w{</span><span class="string">apple cheese</span><span class="punct">},</span>
117
+ <span class="punct">%w{</span><span class="string">beer doritos</span><span class="punct">},</span>
118
+ <span class="punct">%w{</span><span class="string">apple cheese</span><span class="punct">},</span>
119
+ <span class="punct">%w{</span><span class="string">apple cheese</span><span class="punct">},</span>
120
+ <span class="punct">%w{</span><span class="string">apple doritos</span><span class="punct">}</span> <span class="punct">]</span>
121
+
122
+ <span class="ident">rules</span> <span class="punct">=</span> <span class="constant">Apriori</span><span class="punct">.</span><span class="ident">find_association_rules</span><span class="punct">(</span><span class="ident">transactions</span><span class="punct">,</span>
123
+ <span class="symbol">:min_items</span> <span class="punct">=&gt;</span> <span class="number">2</span><span class="punct">,</span>
124
+ <span class="symbol">:max_items</span> <span class="punct">=&gt;</span> <span class="number">5</span><span class="punct">,</span>
125
+ <span class="symbol">:min_support</span> <span class="punct">=&gt;</span> <span class="number">1</span><span class="punct">,</span>
126
+ <span class="symbol">:max_support</span> <span class="punct">=&gt;</span> <span class="number">100</span><span class="punct">,</span>
127
+ <span class="symbol">:min_confidence</span> <span class="punct">=&gt;</span> <span class="number">20</span><span class="punct">)</span>
128
+
129
+ <span class="ident">puts</span> <span class="ident">rules</span><span class="punct">.</span><span class="ident">join</span><span class="punct">(&quot;</span><span class="string"><span class="escape">\n</span></span><span class="punct">&quot;)</span>
130
+
131
+ <span class="comment"># Results: </span>
132
+ <span class="comment"># doritos &lt;- beer (33.3/2, 100.0)</span>
133
+ <span class="comment"># beer &lt;- doritos (50.0/3, 66.7)</span>
134
+ <span class="comment"># apple &lt;- doritos (50.0/3, 33.3)</span>
135
+ <span class="comment"># doritos &lt;- apple (66.7/4, 25.0)</span>
136
+ <span class="comment"># apple &lt;- cheese (50.0/3, 100.0)</span>
137
+ <span class="comment"># cheese &lt;- apple (66.7/4, 75.0)</span>
138
+
139
+ <span class="comment"># NOTE:</span>
140
+ <span class="comment"># doritos &lt;- beer (33.3/2, 100.0)</span>
141
+ <span class="comment"># means: </span>
142
+ <span class="comment"># * beer appears in 33.3% (2 total) of the transactions (the support)</span>
143
+ <span class="comment"># * beer implies doritos 100% of the time (the confidence)</span>
144
+ </pre></p>
145
+
146
+
147
+ <p>See the <ins>examples</ins> directory for more examples of usage.</p>
148
+
149
+
150
+ <h2>Forum</h2>
151
+
152
+
153
+ <p><a href="http://groups.google.com/group/apriori">http://groups.google.com/group/apriori</a></p>
154
+
155
+
156
+ <p><span class="caps">TODO</span> &#8211; create Google Group &#8211; apriori</p>
157
+
158
+
159
+ <h2>How to submit patches</h2>
160
+
161
+
162
+ <ul>
163
+ <li>github: <a href="http://github.com/jashmenn/apriori/tree/master">http://github.com/jashmenn/apriori/tree/master</a></li>
164
+ </ul>
165
+
166
+
167
+ <pre>git clone git://github.com/jashmenn/apriori.git</pre>
168
+
169
+ <h3>Build and test instructions</h3>
170
+
171
+
172
+ <pre>cd apriori
173
+ rake test
174
+ rake install_gem</pre>
175
+
176
+ <p>h3.</p>
177
+
178
+
179
+ <p>If you get the error:</p>
180
+
181
+
182
+ <pre><code>undefined method `add_development_dependency' for #<Gem::Specification:0x2aabcba63ed8></code></pre>
183
+
184
+
185
+ <p>This is because hoe 1.7.0 requires rubygems 1.2.0. To upgrade, simply do the following:</p>
186
+
187
+
188
+ <pre><code>gem update --system</code></pre>
189
+
190
+
191
+ <h2>License</h2>
192
+
193
+
194
+ <h3>Apriori C code</h3>
195
+
196
+
197
+ <p>Copyright&#169; Christian Borgelt</p>
198
+
199
+
200
+ <p>Modified and under the <span class="caps">LGPL</span> license.
201
+ See <pre>ext/apriori/doc/copying</pre> for details.</p>
202
+
203
+
204
+ <h3>Ruby Apriori Extension</h3>
205
+
206
+
207
+ <p>(The <span class="caps">MIT</span> License)</p>
208
+
209
+
210
+ <p>Copyright&#169; 2008 Nate Murray</p>
211
+
212
+
213
+ <p>Permission is hereby granted, free of charge, to any person obtaining
214
+ a copy of this software and associated documentation files (the
215
+ &#8216;Software&#8217;), to deal in the Software without restriction, including
216
+ without limitation the rights to use, copy, modify, merge, publish,
217
+ distribute, sublicense, and/or sell copies of the Software, and to
218
+ permit persons to whom the Software is furnished to do so, subject to
219
+ the following conditions:</p>
220
+
221
+
222
+ <p>The above copyright notice and this permission notice shall be
223
+ included in all copies or substantial portions of the Software.</p>
224
+
225
+
226
+ <p><span class="caps">THE SOFTWARE IS PROVIDED</span> &#8216;AS IS&#8217;, <span class="caps">WITHOUT WARRANTY OF ANY KIND</span>,
227
+ <span class="caps">EXPRESS OR IMPLIED</span>, INCLUDING <span class="caps">BUT NOT LIMITED TO THE WARRANTIES OF</span>
228
+ <span class="caps">MERCHANTABILITY</span>, FITNESS <span class="caps">FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT</span>.
229
+ <span class="caps">IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</span>
230
+ <span class="caps">CLAIM</span>, DAMAGES <span class="caps">OR OTHER LIABILITY</span>, WHETHER <span class="caps">IN AN ACTION OF CONTRACT</span>,
231
+ <span class="caps">TORT OR OTHERWISE</span>, ARISING <span class="caps">FROM</span>, OUT <span class="caps">OF OR IN CONNECTION WITH THE</span>
232
+ <span class="caps">SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE</span>.</p>
233
+
234
+
235
+ <h2>Contact</h2>
236
+
237
+
238
+ <p>Comments are welcome. Send an email to <a href="mailto:nate@natemurray.com">Nate Murray</a> via the <a href="http://groups.google.com/group/apriori">forum</a></p>
239
+ <p class="coda">
240
+ <a href="nate@natemurray.com">Nate Murray</a>, 8th September 2008<br>
241
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
242
+ </p>
243
+ </div>
244
+
245
+ <!-- insert site tracking codes here, like Google Urchin -->
246
+
247
+ </body>
248
+ </html>