nirvdrum-ai4r 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. data/.gitignore +1 -0
  2. data/.rakeTasks +7 -0
  3. data/README.rdoc +56 -0
  4. data/Rakefile.rb +42 -0
  5. data/VERSION +1 -0
  6. data/ai4r.gemspec +221 -0
  7. data/change_log +49 -0
  8. data/examples/classifiers/id3_data.csv +121 -0
  9. data/examples/classifiers/id3_example.rb +29 -0
  10. data/examples/classifiers/naive_bayes_data.csv +11 -0
  11. data/examples/classifiers/naive_bayes_example.rb +16 -0
  12. data/examples/classifiers/results.txt +31 -0
  13. data/examples/genetic_algorithm/genetic_algorithm_example.rb +37 -0
  14. data/examples/genetic_algorithm/travel_cost.csv +16 -0
  15. data/examples/neural_network/backpropagation_example.rb +67 -0
  16. data/examples/neural_network/patterns_with_base_noise.rb +68 -0
  17. data/examples/neural_network/patterns_with_noise.rb +66 -0
  18. data/examples/neural_network/training_patterns.rb +68 -0
  19. data/examples/neural_network/xor_example.rb +35 -0
  20. data/examples/som/som_data.rb +156 -0
  21. data/examples/som/som_multi_node_example.rb +22 -0
  22. data/examples/som/som_single_example.rb +24 -0
  23. data/lib/ai4r.rb +32 -0
  24. data/lib/ai4r/classifiers/classifier.rb +59 -0
  25. data/lib/ai4r/classifiers/hyperpipes.rb +118 -0
  26. data/lib/ai4r/classifiers/id3.rb +326 -0
  27. data/lib/ai4r/classifiers/multilayer_perceptron.rb +135 -0
  28. data/lib/ai4r/classifiers/naive_bayes.rb +259 -0
  29. data/lib/ai4r/classifiers/one_r.rb +110 -0
  30. data/lib/ai4r/classifiers/prism.rb +197 -0
  31. data/lib/ai4r/classifiers/zero_r.rb +73 -0
  32. data/lib/ai4r/clusterers/average_linkage.rb +59 -0
  33. data/lib/ai4r/clusterers/bisecting_k_means.rb +93 -0
  34. data/lib/ai4r/clusterers/centroid_linkage.rb +66 -0
  35. data/lib/ai4r/clusterers/clusterer.rb +61 -0
  36. data/lib/ai4r/clusterers/complete_linkage.rb +67 -0
  37. data/lib/ai4r/clusterers/diana.rb +139 -0
  38. data/lib/ai4r/clusterers/k_means.rb +126 -0
  39. data/lib/ai4r/clusterers/median_linkage.rb +61 -0
  40. data/lib/ai4r/clusterers/single_linkage.rb +194 -0
  41. data/lib/ai4r/clusterers/ward_linkage.rb +64 -0
  42. data/lib/ai4r/clusterers/weighted_average_linkage.rb +61 -0
  43. data/lib/ai4r/data/data_set.rb +266 -0
  44. data/lib/ai4r/data/parameterizable.rb +64 -0
  45. data/lib/ai4r/data/proximity.rb +100 -0
  46. data/lib/ai4r/data/statistics.rb +77 -0
  47. data/lib/ai4r/experiment/classifier_evaluator.rb +95 -0
  48. data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +270 -0
  49. data/lib/ai4r/neural_network/backpropagation.rb +293 -0
  50. data/lib/ai4r/neural_network/hopfield.rb +149 -0
  51. data/lib/ai4r/som/layer.rb +68 -0
  52. data/lib/ai4r/som/node.rb +96 -0
  53. data/lib/ai4r/som/som.rb +155 -0
  54. data/lib/ai4r/som/two_phase_layer.rb +90 -0
  55. data/site/forrest.properties +152 -0
  56. data/site/forrest.properties.dispatcher.properties +25 -0
  57. data/site/forrest.properties.xml +29 -0
  58. data/site/src/documentation/README.txt +7 -0
  59. data/site/src/documentation/classes/CatalogManager.properties +62 -0
  60. data/site/src/documentation/content/locationmap.xml +72 -0
  61. data/site/src/documentation/content/xdocs/downloads.html +9 -0
  62. data/site/src/documentation/content/xdocs/geneticAlgorithms.xml +294 -0
  63. data/site/src/documentation/content/xdocs/index.xml +155 -0
  64. data/site/src/documentation/content/xdocs/machineLearning.xml +131 -0
  65. data/site/src/documentation/content/xdocs/neuralNetworks.xml +270 -0
  66. data/site/src/documentation/content/xdocs/site.xml +54 -0
  67. data/site/src/documentation/content/xdocs/sourceCode.xml +43 -0
  68. data/site/src/documentation/content/xdocs/tabs.xml +35 -0
  69. data/site/src/documentation/resources/images/ai4r-logo.png +0 -0
  70. data/site/src/documentation/resources/images/c.png +0 -0
  71. data/site/src/documentation/resources/images/c_wbn.png +0 -0
  72. data/site/src/documentation/resources/images/c_wn.png +0 -0
  73. data/site/src/documentation/resources/images/ellipse-2.svg +30 -0
  74. data/site/src/documentation/resources/images/ero.gif +0 -0
  75. data/site/src/documentation/resources/images/europe2.png +0 -0
  76. data/site/src/documentation/resources/images/europe3.png +0 -0
  77. data/site/src/documentation/resources/images/fitness.png +0 -0
  78. data/site/src/documentation/resources/images/genetic_algorithms_example.png +0 -0
  79. data/site/src/documentation/resources/images/icon-a.png +0 -0
  80. data/site/src/documentation/resources/images/icon-b.png +0 -0
  81. data/site/src/documentation/resources/images/icon.png +0 -0
  82. data/site/src/documentation/resources/images/jadeferret.png +0 -0
  83. data/site/src/documentation/resources/images/my_email.png +0 -0
  84. data/site/src/documentation/resources/images/neural_network_example.png +0 -0
  85. data/site/src/documentation/resources/images/project-logo.png +0 -0
  86. data/site/src/documentation/resources/images/rubyforge.png +0 -0
  87. data/site/src/documentation/resources/images/s.png +0 -0
  88. data/site/src/documentation/resources/images/s_wbn.png +0 -0
  89. data/site/src/documentation/resources/images/s_wn.png +0 -0
  90. data/site/src/documentation/resources/images/sigmoid.png +0 -0
  91. data/site/src/documentation/resources/images/sub-dir/icon-c.png +0 -0
  92. data/site/src/documentation/resources/images/t.png +0 -0
  93. data/site/src/documentation/resources/images/t_wbn.png +0 -0
  94. data/site/src/documentation/resources/images/t_wn.png +0 -0
  95. data/site/src/documentation/resources/schema/catalog.xcat +29 -0
  96. data/site/src/documentation/resources/schema/hello-v10.dtd +51 -0
  97. data/site/src/documentation/resources/schema/symbols-project-v10.ent +26 -0
  98. data/site/src/documentation/resources/stylesheets/hello2document.xsl +33 -0
  99. data/site/src/documentation/sitemap.xmap +66 -0
  100. data/site/src/documentation/skinconf.xml +418 -0
  101. data/site/src/documentation/translations/langcode.xml +29 -0
  102. data/site/src/documentation/translations/languages_de.xml +24 -0
  103. data/site/src/documentation/translations/languages_en.xml +24 -0
  104. data/site/src/documentation/translations/languages_es.xml +22 -0
  105. data/site/src/documentation/translations/languages_fr.xml +24 -0
  106. data/site/src/documentation/translations/languages_nl.xml +24 -0
  107. data/site/src/documentation/translations/menu.xml +33 -0
  108. data/site/src/documentation/translations/menu_af.xml +33 -0
  109. data/site/src/documentation/translations/menu_de.xml +33 -0
  110. data/site/src/documentation/translations/menu_es.xml +33 -0
  111. data/site/src/documentation/translations/menu_fr.xml +33 -0
  112. data/site/src/documentation/translations/menu_it.xml +33 -0
  113. data/site/src/documentation/translations/menu_nl.xml +33 -0
  114. data/site/src/documentation/translations/menu_no.xml +33 -0
  115. data/site/src/documentation/translations/menu_ru.xml +33 -0
  116. data/site/src/documentation/translations/menu_sk.xml +33 -0
  117. data/site/src/documentation/translations/tabs.xml +22 -0
  118. data/site/src/documentation/translations/tabs_de.xml +22 -0
  119. data/site/src/documentation/translations/tabs_es.xml +22 -0
  120. data/site/src/documentation/translations/tabs_fr.xml +22 -0
  121. data/site/src/documentation/translations/tabs_nl.xml +22 -0
  122. data/test/classifiers/hyperpipes_test.rb +84 -0
  123. data/test/classifiers/id3_test.rb +208 -0
  124. data/test/classifiers/multilayer_perceptron_test.rb +79 -0
  125. data/test/classifiers/naive_bayes_test.rb +43 -0
  126. data/test/classifiers/one_r_test.rb +62 -0
  127. data/test/classifiers/prism_test.rb +85 -0
  128. data/test/classifiers/zero_r_test.rb +50 -0
  129. data/test/clusterers/average_linkage_test.rb +51 -0
  130. data/test/clusterers/bisecting_k_means_test.rb +66 -0
  131. data/test/clusterers/centroid_linkage_test.rb +53 -0
  132. data/test/clusterers/complete_linkage_test.rb +57 -0
  133. data/test/clusterers/diana_test.rb +69 -0
  134. data/test/clusterers/k_means_test.rb +100 -0
  135. data/test/clusterers/median_linkage_test.rb +53 -0
  136. data/test/clusterers/single_linkage_test.rb +122 -0
  137. data/test/clusterers/ward_linkage_test.rb +53 -0
  138. data/test/clusterers/weighted_average_linkage_test.rb +53 -0
  139. data/test/data/data_set.csv +121 -0
  140. data/test/data/data_set_test.rb +96 -0
  141. data/test/data/proximity_test.rb +81 -0
  142. data/test/data/statistics_data_set.csv +5 -0
  143. data/test/data/statistics_test.rb +65 -0
  144. data/test/experiment/classifier_evaluator_test.rb +76 -0
  145. data/test/genetic_algorithm/chromosome_test.rb +58 -0
  146. data/test/genetic_algorithm/genetic_algorithm_test.rb +81 -0
  147. data/test/neural_network/backpropagation_test.rb +69 -0
  148. data/test/neural_network/hopfield_test.rb +72 -0
  149. data/test/som/som_test.rb +97 -0
  150. metadata +238 -0
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/naive_bayes'
2
+ require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
3
+ require 'test/unit'
4
+
5
+ include Ai4r::Classifiers
6
+ include Ai4r::Data
7
+
8
+ class NaiveBayesTest < Test::Unit::TestCase
9
+
10
+ @@data_labels = [ "Color","Type","Origin","Stolen?" ]
11
+
12
+ @@data_items = [
13
+ ["Red", "Sports", "Domestic", "Yes"],
14
+ ["Red", "Sports", "Domestic", "No"],
15
+ ["Red", "Sports", "Domestic", "Yes"],
16
+ ["Yellow","Sports", "Domestic", "No"],
17
+ ["Yellow","Sports", "Imported", "Yes"],
18
+ ["Yellow","SUV", "Imported", "No"],
19
+ ["Yellow","SUV", "Imported", "Yes"],
20
+ ["Yellow","Sports", "Domestic", "No"],
21
+ ["Red", "SUV", "Imported", "No"],
22
+ ["Red", "Sports", "Imported", "Yes"]
23
+ ]
24
+
25
+ def setup
26
+ @data_set = DataSet.new
27
+ @data_set = DataSet.new(:data_items => @@data_items, :data_labels => @@data_labels)
28
+ @b = NaiveBayes.new.set_parameters({:m=>3}).build @data_set
29
+ end
30
+
31
+ def test_eval
32
+ result = @b.eval(["Red", "SUV", "Domestic"])
33
+ assert_equal "No", result
34
+ end
35
+
36
+ def test_get_probability_map
37
+ map = @b.get_probability_map(["Red", "SUV", "Domestic"])
38
+ assert_equal 2, map.keys.length
39
+ assert_in_delta 0.42, map["Yes"], 0.1
40
+ assert_in_delta 0.58, map["No"], 0.1
41
+ end
42
+
43
+ end
@@ -0,0 +1,62 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/one_r'
3
+
4
+ class OneRTest < Test::Unit::TestCase
5
+
6
+ include Ai4r::Classifiers
7
+ include Ai4r::Data
8
+
9
+ @@data_examples = [ ['New York', '<30', 'M', 'Y'],
10
+ ['Chicago', '<30', 'M', 'Y'],
11
+ ['New York', '<30', 'M', 'Y'],
12
+ ['New York', '[30-50)', 'F', 'N'],
13
+ ['Chicago', '[30-50)', 'F', 'Y'],
14
+ ['New York', '[30-50)', 'F', 'N'],
15
+ ['Chicago', '[50-80]', 'M', 'N']
16
+ ]
17
+
18
+ @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
19
+
20
+ def test_build
21
+ assert_raise(ArgumentError) { OneR.new.build(DataSet.new) }
22
+ classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
23
+ assert_not_nil(classifier.data_set.data_labels)
24
+ assert_not_nil(classifier.rule)
25
+ assert_equal("attribute_1", classifier.data_set.data_labels.first)
26
+ assert_equal("class_value", classifier.data_set.data_labels.last)
27
+ classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
28
+ :data_labels => @@data_labels))
29
+ assert_not_nil(classifier.data_set.data_labels)
30
+ assert_not_nil(classifier.rule)
31
+ assert_equal("city", classifier.data_set.data_labels.first)
32
+ assert_equal("marketing_target", classifier.data_set.data_labels.last)
33
+ assert_equal(1, classifier.rule[:attr_index])
34
+ end
35
+
36
+ def test_eval
37
+ classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
38
+ assert_equal("Y", classifier.eval(['New York', '<30', 'M']))
39
+ assert_equal("N", classifier.eval(['New York', '[30-50)', 'M']))
40
+ assert_equal("N", classifier.eval(['Chicago', '[50-80]', 'M']))
41
+ end
42
+
43
+ def test_get_rules
44
+ classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
45
+ :data_labels => @@data_labels))
46
+ marketing_target = nil
47
+ age_range = nil
48
+ eval(classifier.get_rules)
49
+ assert_nil(marketing_target)
50
+ age_range = '<30'
51
+ eval(classifier.get_rules)
52
+ assert_equal("Y", marketing_target)
53
+ age_range = '[30-50)'
54
+ eval(classifier.get_rules)
55
+ assert_equal("N", marketing_target)
56
+ age_range = '[50-80]'
57
+ eval(classifier.get_rules)
58
+ assert_equal("N", marketing_target)
59
+ end
60
+
61
+ end
62
+
@@ -0,0 +1,85 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/prism'
3
+
4
+
5
+ class PrismTest < Test::Unit::TestCase
6
+
7
+ include Ai4r::Classifiers
8
+ include Ai4r::Data
9
+
10
+ @@data_examples = [ ['New York', '<30', 'M', 'Y'],
11
+ ['Chicago', '<30', 'M', 'Y'],
12
+ ['Chicago', '<30', 'F', 'Y'],
13
+ ['New York', '<30', 'M', 'Y'],
14
+ ['New York', '<30', 'M', 'Y'],
15
+ ['Chicago', '[30-50)', 'M', 'Y'],
16
+ ['New York', '[30-50)', 'F', 'N'],
17
+ ['Chicago', '[30-50)', 'F', 'Y'],
18
+ ['New York', '[30-50)', 'F', 'N'],
19
+ ['Chicago', '[50-80]', 'M', 'N'],
20
+ ['New York', '[50-80]', 'F', 'N'],
21
+ ['New York', '[50-80]', 'M', 'N'],
22
+ ['Chicago', '[50-80]', 'M', 'N'],
23
+ ['New York', '[50-80]', 'F', 'N'],
24
+ ['Chicago', '>80', 'F', 'Y']
25
+ ]
26
+
27
+ @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
28
+
29
+ def test_build
30
+ assert_raise(ArgumentError) { Prism.new.build(DataSet.new) }
31
+ classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
32
+ assert_not_nil(classifier.data_set.data_labels)
33
+ assert_not_nil(classifier.rules)
34
+ assert_equal("attribute_1", classifier.data_set.data_labels.first)
35
+ assert_equal("class_value", classifier.data_set.data_labels.last)
36
+ classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
37
+ :data_labels => @@data_labels))
38
+ assert_not_nil(classifier.data_set.data_labels)
39
+ assert_not_nil(classifier.rules)
40
+ assert_equal("city", classifier.data_set.data_labels.first)
41
+ assert_equal("marketing_target", classifier.data_set.data_labels.last)
42
+ assert !classifier.rules.empty?
43
+
44
+ Prism.send(:public, *Prism.protected_instance_methods)
45
+ Prism.send(:public, *Prism.private_instance_methods)
46
+ end
47
+
48
+ def test_eval
49
+ classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
50
+ @@data_examples.each do |data|
51
+ assert_equal(data.last, classifier.eval(data[0...-1]))
52
+ end
53
+ end
54
+
55
+ def test_get_rules
56
+ classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
57
+ :data_labels => @@data_labels))
58
+ marketing_target = nil
59
+ age_range = nil
60
+ city = 'Chicago'
61
+ eval(classifier.get_rules)
62
+ age_range = '<30'
63
+ eval(classifier.get_rules)
64
+ assert_equal("Y", marketing_target)
65
+ age_range = '[30-50)'
66
+ eval(classifier.get_rules)
67
+ assert_equal("Y", marketing_target)
68
+ age_range = '[30-50)'
69
+ city = 'New York'
70
+ eval(classifier.get_rules)
71
+ assert_equal("N", marketing_target)
72
+ age_range = '[50-80]'
73
+ eval(classifier.get_rules)
74
+ assert_equal("N", marketing_target)
75
+ end
76
+
77
+ def test_matches_conditions
78
+ classifier = Prism.new.build(DataSet.new(:data_labels => @@data_labels,
79
+ :data_items => @@data_examples))
80
+
81
+ assert classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "<30"})
82
+ assert !classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "[50-80]"})
83
+ end
84
+ end
85
+
@@ -0,0 +1,50 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/zero_r'
3
+ require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
4
+
5
+ class ZeroRTest < Test::Unit::TestCase
6
+
7
+ include Ai4r::Classifiers
8
+ include Ai4r::Data
9
+
10
+ @@data_examples = [
11
+ ['New York', '[30-50)', 'F', 'N'],
12
+ ['New York', '<30', 'M', 'Y'],
13
+ ['Chicago', '<30', 'M', 'Y'],
14
+ ['New York', '<30', 'M', 'Y'],
15
+ ['Chicago', '[30-50)', 'F', 'Y'],
16
+ ['New York', '[30-50)', 'F', 'N'],
17
+ ['Chicago', '[50-80]', 'M', 'N'],
18
+ ]
19
+
20
+ @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
21
+
22
+ def test_build
23
+ assert_raise(ArgumentError) { ZeroR.new.build(DataSet.new) }
24
+ classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
25
+ assert_equal("Y", classifier.class_value)
26
+ assert_equal("attribute_1", classifier.data_set.data_labels.first)
27
+ assert_equal("class_value", classifier.data_set.data_labels.last)
28
+ classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
29
+ :data_labels => @@data_labels))
30
+ assert_equal("Y", classifier.class_value)
31
+ assert_equal("city", classifier.data_set.data_labels.first)
32
+ assert_equal("marketing_target", classifier.data_set.data_labels.last)
33
+ end
34
+
35
+ def test_eval
36
+ classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
37
+ assert_equal('Y', classifier.eval(@@data_examples.first) )
38
+ assert_equal('Y', classifier.eval(@@data_examples.last) )
39
+ end
40
+
41
+ def test_get_rules
42
+ classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
43
+ :data_labels => @@data_labels))
44
+ marketing_target = nil
45
+ eval(classifier.get_rules)
46
+ assert_equal('Y', marketing_target)
47
+ end
48
+
49
+ end
50
+
@@ -0,0 +1,51 @@
1
+ # Author:: Sergio Fierens (implementation)
2
+ # License:: MPL 1.1
3
+ # Project:: ai4r
4
+ # Url:: http://ai4r.rubyforge.org/
5
+ #
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Mozilla Public License version 1.1 as published by the
8
+ # Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
9
+
10
+ require 'test/unit'
11
+ require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/average_linkage'
12
+
13
+ class Ai4r::Clusterers::AverageLinkage < Ai4r::Clusterers::SingleLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
15
+ end
16
+
17
+ class AverageLinkageTest < Test::Unit::TestCase
18
+
19
+ include Ai4r::Clusterers
20
+ include Ai4r::Data
21
+
22
+ @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
+ [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
+
25
+ @@expected_distance_matrix = [
26
+ [98.0],
27
+ [89.0, 5.0],
28
+ [68.0, 26.0, 9.0],
29
+ [74.0, 4.0, 1.0, 10.0],
30
+ [0.0, 98.0, 89.0, 68.0, 74.0],
31
+ [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
+ [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
+ [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
+ [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
+ [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
+ [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
+
38
+ def setup
39
+ Ai4r::Clusterers::AverageLinkage.send(:public,
40
+ *Ai4r::Clusterers::AverageLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::AverageLinkage.new
45
+ clusterer.distance_matrix = @@expected_distance_matrix
46
+ assert_equal 93.5, clusterer.linkage_distance(0,1,2)
47
+ assert_equal 37.5, clusterer.linkage_distance(4,2,5)
48
+ end
49
+
50
+ end
51
+
@@ -0,0 +1,66 @@
1
+ # Author:: Sergio Fierens (implementation)
2
+ # License:: MPL 1.1
3
+ # Project:: ai4r
4
+ # Url:: http://ai4r.rubyforge.org/
5
+ #
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Mozilla Public License version 1.1 as published by the
8
+ # Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
9
+
10
+ require 'test/unit'
11
+ require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/bisecting_k_means'
12
+
13
+ class BisectingKMeansTest < Test::Unit::TestCase
14
+
15
+ include Ai4r::Clusterers
16
+ include Ai4r::Data
17
+
18
+ @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
19
+ [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
20
+
21
+ def test_build_without_refine
22
+ build(false)
23
+ end
24
+
25
+ def test_build_with_refine
26
+ build(true)
27
+ end
28
+
29
+ protected
30
+ def build(refine)
31
+ data_set = DataSet.new(:data_items => @@data, :data_labels => ["X", "Y"])
32
+ clusterer = BisectingKMeans.new
33
+ clusterer.set_parameters :refine => refine
34
+ clusterer.build(data_set, 4)
35
+ #draw_map(clusterer)
36
+ # Verify that all 4 clusters are created
37
+ assert_equal 4, clusterer.clusters.length
38
+ assert_equal 4, clusterer.centroids.length
39
+ # The addition of all instances of every cluster must be equal than
40
+ # the number of data points
41
+ total_length = 0
42
+ clusterer.clusters.each do |cluster|
43
+ total_length += cluster.data_items.length
44
+ end
45
+ assert_equal @@data.length, total_length
46
+ # Data inside clusters must be the same as orifinal data
47
+ clusterer.clusters.each do |cluster|
48
+ cluster.data_items.each do |data_item|
49
+ assert @@data.include?(data_item)
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+ def draw_map(clusterer)
56
+ map = Array.new(11) {Array.new(11, 0)}
57
+ clusterer.clusters.each_index do |i|
58
+ clusterer.clusters[i].data_items.each do |point|
59
+ map[point.first][point.last]=(i+1)
60
+ end
61
+ end
62
+ map.each { |row| puts row.inspect}
63
+ end
64
+
65
+ end
66
+
@@ -0,0 +1,53 @@
1
+ # Author:: Sergio Fierens (implementation)
2
+ # License:: MPL 1.1
3
+ # Project:: ai4r
4
+ # Url:: http://ai4r.rubyforge.org/
5
+ #
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Mozilla Public License version 1.1 as published by the
8
+ # Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
9
+
10
+ require 'test/unit'
11
+ require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/centroid_linkage'
12
+
13
+ class Ai4r::Clusterers::CentroidLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix, :index_clusters
15
+ end
16
+
17
+ class Ai4r::Clusterers::CentroidLinkageTest < Test::Unit::TestCase
18
+
19
+ include Ai4r::Clusterers
20
+ include Ai4r::Data
21
+
22
+ @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
+ [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
+
25
+ @@expected_distance_matrix = [
26
+ [98.0],
27
+ [89.0, 5.0],
28
+ [68.0, 26.0, 9.0],
29
+ [74.0, 4.0, 1.0, 10.0],
30
+ [0.0, 98.0, 89.0, 68.0, 74.0],
31
+ [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
+ [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
+ [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
+ [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
+ [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
+ [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
+
38
+ def setup
39
+ Ai4r::Clusterers::CentroidLinkage.send(:public,
40
+ *Ai4r::Clusterers::CentroidLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::CentroidLinkage.new
45
+ clusterer.data_set = DataSet.new :data_items => @@data
46
+ clusterer.index_clusters = clusterer.create_initial_index_clusters
47
+ clusterer.distance_matrix = @@expected_distance_matrix
48
+ assert_equal 92.25, clusterer.linkage_distance(0,1,2)
49
+ assert_equal 15.25, clusterer.linkage_distance(4,2,5)
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,57 @@
1
+ # Author:: Sergio Fierens (implementation)
2
+ # License:: MPL 1.1
3
+ # Project:: ai4r
4
+ # Url:: http://ai4r.rubyforge.org/
5
+ #
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Mozilla Public License version 1.1 as published by the
8
+ # Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
9
+
10
+ require 'test/unit'
11
+ require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/complete_linkage'
12
+
13
+ class Ai4r::Clusterers::CompleteLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
15
+ end
16
+
17
+ class CompleteLinkageTest < Test::Unit::TestCase
18
+
19
+ include Ai4r::Clusterers
20
+ include Ai4r::Data
21
+
22
+ @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
+ [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
+
25
+ @@expected_distance_matrix = [
26
+ [98.0],
27
+ [89.0, 5.0],
28
+ [68.0, 26.0, 9.0],
29
+ [74.0, 4.0, 1.0, 10.0],
30
+ [0.0, 98.0, 89.0, 68.0, 74.0],
31
+ [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
+ [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
+ [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
+ [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
+ [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
+ [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
+
38
+ def setup
39
+ Ai4r::Clusterers::CompleteLinkage.send(:public,
40
+ *Ai4r::Clusterers::CompleteLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::CompleteLinkage.new
45
+ clusterer.distance_matrix = @@expected_distance_matrix
46
+ assert_equal 98, clusterer.linkage_distance(0,1,2)
47
+ assert_equal 74, clusterer.linkage_distance(4,2,5)
48
+ end
49
+
50
+ def test_distance_between_item_and_cluster
51
+ clusterer = CompleteLinkage.new
52
+ assert_equal 32.0, clusterer.distance_between_item_and_cluster([1,2],
53
+ DataSet.new(:data_items => [[3,4],[5,6]]))
54
+ end
55
+
56
+ end
57
+