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,69 @@
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/diana'
12
+
13
+ class Ai4r::Clusterers::Diana
14
+ attr_accessor :data_set, :number_of_clusters, :clusters
15
+ end
16
+
17
+ class DianaTest < Test::Unit::TestCase
18
+
19
+ @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
20
+ [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
21
+
22
+ include Ai4r::Clusterers
23
+ include Ai4r::Data
24
+
25
+ def setup
26
+ Diana.send(:public, *Diana.protected_instance_methods)
27
+ @data_set = DataSet.new(:data_items => @@data.clone)
28
+ end
29
+
30
+ def test_build
31
+ clusterer = Diana.new.build(@data_set, 4)
32
+ assert_equal 4, clusterer.clusters.length
33
+ end
34
+
35
+ def test_eval
36
+ clusterer = Diana.new.build(@data_set, 4)
37
+ assert_equal 0, clusterer.eval([0, 0])
38
+ assert_equal 1, clusterer.eval([9, 3])
39
+ assert_equal 2, clusterer.eval([0,10])
40
+ assert_equal 3, clusterer.eval([8, 0])
41
+ end
42
+
43
+ def test_cluster_diameter
44
+ clusterer = Diana.new
45
+ assert_equal 106, clusterer.cluster_diameter(@data_set)
46
+ assert_equal 98, clusterer.cluster_diameter(@data_set[0..2])
47
+ end
48
+
49
+ def test_max_diameter_cluster
50
+ clusterer = Diana.new
51
+ assert_equal 0, clusterer.max_diameter_cluster([@data_set, @data_set[0..2]])
52
+ assert_equal 1, clusterer.max_diameter_cluster([@data_set[0..2], @data_set])
53
+ end
54
+
55
+ def test_init_splinter_cluster
56
+ clusterer = Diana.new
57
+ assert_equal [10,3], clusterer.
58
+ init_splinter_cluster(@data_set).data_items[0]
59
+ end
60
+
61
+ def test_max_distance_difference
62
+ clusterer = Diana.new
63
+ data_set_a = @data_set[1..-1]
64
+ data_set_b = @data_set[0]
65
+ assert_equal [63.7, 4], clusterer.
66
+ max_distance_difference(data_set_a, data_set_b)
67
+ end
68
+
69
+ end
@@ -0,0 +1,100 @@
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/k_means'
12
+
13
+ class KMeansTest < 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
22
+ data_set = DataSet.new(:data_items => @@data, :data_labels => ["X", "Y"])
23
+ clusterer = KMeans.new.build(data_set, 4)
24
+ #draw_map(clusterer)
25
+ # Verify that all 4 clusters are created
26
+ assert_equal 4, clusterer.clusters.length
27
+ assert_equal 4, clusterer.centroids.length
28
+ # The addition of all instances of every cluster must be equal than
29
+ # the number of data points
30
+ total_length = 0
31
+ clusterer.clusters.each do |cluster|
32
+ total_length += cluster.data_items.length
33
+ end
34
+ assert_equal @@data.length, total_length
35
+ # Data inside clusters must be the same as orifinal data
36
+ clusterer.clusters.each do |cluster|
37
+ cluster.data_items.each do |data_item|
38
+ assert @@data.include?(data_item)
39
+ end
40
+ end
41
+ end
42
+
43
+ def test_eval
44
+ data_set = DataSet.new(:data_items => @@data, :data_labels => ["X", "Y"])
45
+ clusterer = KMeans.new.build(data_set, 4)
46
+ item = [10,0]
47
+ cluster_index = clusterer.eval(item)
48
+ # Must return a valid cluster index [0-3]
49
+ assert cluster_index >= 0 && cluster_index < 4
50
+ # Distance to cluster centroid must be less than distance to any other
51
+ # centroid
52
+ min_distance = clusterer.distance(clusterer.centroids[cluster_index], item)
53
+ clusterer.centroids.each do |centroid|
54
+ assert clusterer.distance(centroid, item) >= min_distance
55
+ end
56
+ end
57
+
58
+ def test_distance
59
+ clusterer = KMeans.new
60
+ # By default, distance returns the eucledian distance to the power of 2
61
+ assert_equal 2385, clusterer.distance(
62
+ [1, 10, "Chicago", 2],
63
+ [10, 10, "London", 50])
64
+ # Test new distance definition
65
+ manhattan_distance = lambda do |a, b|
66
+ dist = 0.0
67
+ a.each_index do |index|
68
+ if a[index].is_a?(Numeric) && b[index].is_a?(Numeric)
69
+ dist = dist + (a[index]-b[index]).abs
70
+ end
71
+ end
72
+ dist
73
+ end
74
+ clusterer.set_parameters({:distance_function => manhattan_distance})
75
+ assert_equal 57, clusterer.distance(
76
+ [1, 10, "Chicago", 2],
77
+ [10, 10, "London", 50])
78
+ end
79
+
80
+ def test_max_iterations
81
+ data_set = DataSet.new(:data_items => @@data, :data_labels => ["X", "Y"])
82
+ clusterer = KMeans.new.
83
+ set_parameters({:max_iterations=>1}).
84
+ build(data_set, 4)
85
+ assert_equal 1, clusterer.iterations
86
+ end
87
+
88
+ private
89
+ def draw_map(clusterer)
90
+ map = Array.new(11) {Array.new(11, 0)}
91
+ clusterer.clusters.each_index do |i|
92
+ clusterer.clusters[i].data_items.each do |point|
93
+ map[point.first][point.last]=(i+1)
94
+ end
95
+ end
96
+ map.each { |row| puts row.inspect}
97
+ end
98
+
99
+ end
100
+
@@ -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/median_linkage'
12
+
13
+ class Ai4r::Clusterers::MedianLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix, :index_clusters
15
+ end
16
+
17
+ class Ai4r::Clusterers::MedianLinkageTest < 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::MedianLinkage.send(:public,
40
+ *Ai4r::Clusterers::MedianLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::MedianLinkage.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,122 @@
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/single_linkage'
12
+
13
+ class Ai4r::Clusterers::SingleLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
15
+ end
16
+
17
+ class SingleLinkageTest < 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
+ SingleLinkage.send(:public, *SingleLinkage.protected_instance_methods)
40
+ end
41
+
42
+ def test_build
43
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
44
+ clusterer.build(DataSet.new(:data_items => @@data), 4)
45
+ #draw_map(clusterer)
46
+ assert_equal 4, clusterer.clusters.length
47
+ end
48
+
49
+ def test_eval
50
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
51
+ clusterer.build(DataSet.new(:data_items => @@data), 4)
52
+ assert_equal 2, clusterer.eval([0,8])
53
+ assert_equal 0, clusterer.eval([8,0])
54
+ end
55
+
56
+ def test_create_distance_matrix
57
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
58
+ clusterer.create_distance_matrix(DataSet.new(:data_items => @@data))
59
+ assert clusterer.distance_matrix
60
+ clusterer.distance_matrix.each_with_index do |row, row_index|
61
+ assert_equal row_index+1, row.length
62
+ end
63
+ assert_equal @@expected_distance_matrix, clusterer.distance_matrix
64
+ end
65
+
66
+ def test_read_distance_matrix
67
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
68
+ clusterer.distance_matrix = @@expected_distance_matrix
69
+ assert_equal 9.0, clusterer.read_distance_matrix(3, 2)
70
+ assert_equal 9.0, clusterer.read_distance_matrix(2, 3)
71
+ assert_equal 0, clusterer.read_distance_matrix(5, 5)
72
+ end
73
+
74
+ def test_linkage_distance
75
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
76
+ clusterer.distance_matrix = @@expected_distance_matrix
77
+ assert_equal 89, clusterer.linkage_distance(0,1,2)
78
+ assert_equal 1, clusterer.linkage_distance(4,2,5)
79
+ end
80
+
81
+ def test_get_closest_clusters
82
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
83
+ clusterer.distance_matrix = @@expected_distance_matrix
84
+ assert_equal [1,0], clusterer.get_closest_clusters([[0,1], [3,4]])
85
+ assert_equal [2,1], clusterer.get_closest_clusters([[3,4], [0,1], [5,6]])
86
+ end
87
+
88
+ def test_create_initial_index_clusters
89
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
90
+ clusterer.data_set = DataSet.new :data_items => @@data
91
+ index_clusters = clusterer.create_initial_index_clusters
92
+ assert_equal @@data.length, index_clusters.length
93
+ assert_equal 0, index_clusters.first.first
94
+ assert_equal @@data.length-1, index_clusters.last.first
95
+ end
96
+
97
+ def test_merge_clusters
98
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
99
+ clusters = clusterer.merge_clusters(1,2, [[1,2],[3,4],[5,6]])
100
+ assert_equal [[1,2], [3,4,5,6]], clusters.collect {|x| x.sort}
101
+ clusters = clusterer.merge_clusters(2,1, [[1,2],[3,4],[5,6]])
102
+ assert_equal [[1,2], [3,4,5,6]], clusters.collect {|x| x.sort}
103
+ end
104
+
105
+ def test_distance_between_item_and_cluster
106
+ clusterer = Ai4r::Clusterers::SingleLinkage.new
107
+ assert_equal 8.0, clusterer.distance_between_item_and_cluster([1,2],
108
+ DataSet.new(:data_items => [[3,4],[5,6]]))
109
+ end
110
+
111
+ private
112
+ def draw_map(clusterer)
113
+ map = Array.new(11) {Array.new(11, 0)}
114
+ clusterer.clusters.each_index do |i|
115
+ clusterer.clusters[i].data_items.each do |point|
116
+ map[point.first][point.last]=(i+1)
117
+ end
118
+ end
119
+ map.each { |row| puts row.inspect}
120
+ end
121
+
122
+ end
@@ -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/ward_linkage'
12
+
13
+ class Ai4r::Clusterers::WardLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix, :index_clusters
15
+ end
16
+
17
+ class Ai4r::Clusterers::WardLinkageTest < 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::WardLinkage.send(:public,
40
+ *Ai4r::Clusterers::WardLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::WardLinkage.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_in_delta 123.4166, clusterer.linkage_distance(0,1,2), 0.0001
49
+ assert_equal 27.75, clusterer.linkage_distance(4,2,5)
50
+ end
51
+
52
+ end
53
+
@@ -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/weighted_average_linkage'
12
+
13
+ class Ai4r::Clusterers::WeightedAverageLinkage
14
+ attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix, :index_clusters
15
+ end
16
+
17
+ class Ai4r::Clusterers::WeightedAverageLinkageTest < 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::WeightedAverageLinkage.send(:public,
40
+ *Ai4r::Clusterers::WeightedAverageLinkage.protected_instance_methods)
41
+ end
42
+
43
+ def test_linkage_distance
44
+ clusterer = Ai4r::Clusterers::WeightedAverageLinkage.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 93.5, clusterer.linkage_distance(0,1,2)
49
+ assert_equal 37.5, clusterer.linkage_distance(4,2,5)
50
+ end
51
+
52
+ end
53
+