ai4r 1.4 → 1.5
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.
- data/README.rdoc +24 -3
- data/examples/decision_trees/id3_example.rb +1 -1
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +1 -1
- data/lib/ai4r.rb +11 -0
- data/lib/ai4r/classifiers/classifier.rb +2 -0
- data/lib/ai4r/classifiers/id3.rb +3 -2
- data/lib/ai4r/classifiers/multilayer_perceptron.rb +135 -0
- data/lib/ai4r/classifiers/one_r.rb +2 -1
- data/lib/ai4r/classifiers/prism.rb +2 -1
- data/lib/ai4r/classifiers/zero_r.rb +2 -1
- data/lib/ai4r/clusterers/average_linkage.rb +60 -0
- data/lib/ai4r/clusterers/bisecting_k_means.rb +17 -39
- data/lib/ai4r/clusterers/clusterer.rb +25 -0
- data/lib/ai4r/clusterers/complete_linkage.rb +62 -0
- data/lib/ai4r/clusterers/k_means.rb +18 -25
- data/lib/ai4r/clusterers/single_linkage.rb +179 -0
- data/lib/ai4r/data/data_set.rb +33 -41
- data/lib/ai4r/data/proximity.rb +82 -0
- data/lib/ai4r/data/statistics.rb +77 -0
- data/lib/ai4r/experiment/classifier_evaluator.rb +95 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +2 -4
- data/site/build/site/en/build/tmp/build-info.xml +5 -0
- data/site/build/site/en/build/tmp/plugins-1.xml +212 -0
- data/site/build/site/en/build/tmp/plugins-2.xml +252 -0
- data/site/build/site/en/build/tmp/projfilters.properties +41 -0
- data/site/build/site/en/downloads.html +1 -1
- data/site/build/site/en/geneticAlgorithms.html +1 -1
- data/site/build/site/en/index.html +44 -7
- data/site/build/site/en/index.pdf +278 -155
- data/site/build/site/en/linkmap.html +2 -2
- data/site/build/site/en/linkmap.pdf +12 -12
- data/site/build/site/en/machineLearning.html +1 -1
- data/site/build/site/en/neuralNetworks.html +1 -1
- data/site/build/site/en/sourceCode.html +244 -0
- data/site/build/site/en/sourceCode.pdf +278 -0
- data/site/build/site/en/svn.html +34 -42
- data/site/build/site/en/svn.pdf +86 -114
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.data +0 -0
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.index +0 -0
- data/site/build/tmp/projfilters.properties +1 -1
- data/site/build/webapp/WEB-INF/logs/core.log +628 -629
- data/site/build/webapp/WEB-INF/logs/error.log +213 -213
- data/site/src/documentation/content/xdocs/index.xml +20 -1
- data/site/src/documentation/content/xdocs/site.xml +1 -1
- data/site/src/documentation/content/xdocs/sourceCode.xml +43 -0
- data/site/src/documentation/resources/images/sigmoid.png +0 -0
- data/test/classifiers/id3_test.rb +0 -1
- data/test/classifiers/multilayer_perceptron_test.rb +79 -0
- data/test/classifiers/one_r_test.rb +0 -2
- data/test/classifiers/prism_test.rb +0 -2
- data/test/classifiers/zero_r_test.rb +0 -2
- data/test/clusterers/average_linkage_test.rb +45 -0
- data/test/clusterers/bisecting_k_means_test.rb +0 -2
- data/test/clusterers/complete_linkage_test.rb +45 -0
- data/test/clusterers/k_means_test.rb +0 -2
- data/test/clusterers/single_linkage_test.rb +113 -0
- data/test/data/data_set_test.rb +3 -15
- data/test/data/proximity_test.rb +71 -0
- data/test/data/statistics_test.rb +65 -0
- data/test/experiment/classifier_evaluator_test.rb +76 -0
- metadata +27 -6
- data/site/src/documentation/content/xdocs/svn.xml +0 -41
@@ -47,7 +47,7 @@ See http://forrest.apache.org/docs/linking.html for more info
|
|
47
47
|
</practicalExamples>
|
48
48
|
<download label="Downloads" href="downloads.html" description="ai4r - Download Files"/>
|
49
49
|
<forum label="Forum" href="http://forum.jadeferret.com/viewforum.php?f=3" description="Ai4r Forum"/>
|
50
|
-
<svn label="Source Code repository" href="
|
50
|
+
<svn label="Source Code repository" href="sourceCode.html" description="ai4r source code repository"/>
|
51
51
|
<wiki label="AI4R Wiki" href="http://wiki.jadeferret.com/Category:AI4R" description="ai4r wiki with How-to guides and more documentation"/>
|
52
52
|
<rdoc label="API doc (Rdoc)" href="http://ai4r.rubyforge.org/rdoc/index.html" description="Ai4 RDoc docs"/>
|
53
53
|
</about>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
|
3
|
+
<document>
|
4
|
+
<header>
|
5
|
+
<title>Subversion repository for ai4r (Artificial Intelligence for Ruby)</title>
|
6
|
+
</header>
|
7
|
+
<body>
|
8
|
+
<section id="github">
|
9
|
+
<title>AI4R at GitHub</title>
|
10
|
+
<p>AI4R Source Code is stored in a git repository at GitHub:</p>
|
11
|
+
<p>
|
12
|
+
<a href="http://github.com/JadeFerret/ai4r" title="AI4R source code at GitHub">
|
13
|
+
http://github.com/JadeFerret/ai4r
|
14
|
+
</a>
|
15
|
+
</p>
|
16
|
+
<p>The public clone url is:</p>
|
17
|
+
<p>
|
18
|
+
<a href="git://github.com/JadeFerret/ai4r.git" title="AI4R git repository">
|
19
|
+
git://github.com/JadeFerret/ai4r.git
|
20
|
+
</a>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
</section>
|
24
|
+
|
25
|
+
<section id="download">
|
26
|
+
<title>Download the source code</title>
|
27
|
+
<p>If you want to download ai4r code without using git,
|
28
|
+
visit
|
29
|
+
<a href="http://github.com/JadeFerret/ai4r/downloads" title="AI4R source code download">
|
30
|
+
AI4R source code download site</a>, and click on the "download" button.
|
31
|
+
</p>
|
32
|
+
</section>
|
33
|
+
|
34
|
+
<section id="moreinfor">
|
35
|
+
<title>More info on Git</title>
|
36
|
+
<p>If you need help on using git, the best documentation is available
|
37
|
+
<a href="http://git-scm.com/documentation" title="git documentation">here</a>.</p>
|
38
|
+
<p>If you work in SCM, you may find <a href="http://scm.jadeferret.com" title="Agile SCM blog">Jade Ferret’s Agile SCM blog</a>
|
39
|
+
interesting.</p>
|
40
|
+
</section>
|
41
|
+
|
42
|
+
</body>
|
43
|
+
</document>
|
File without changes
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/multilayer_perceptron'
|
3
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
|
4
|
+
|
5
|
+
# Make all accessors and methods public
|
6
|
+
class Ai4r::Classifiers::MultilayerPerceptron
|
7
|
+
attr_accessor :data_set, :class_value, :network, :domains, :outputs
|
8
|
+
public :get_max_index
|
9
|
+
public :data_to_output
|
10
|
+
end
|
11
|
+
|
12
|
+
class MultilayerPerceptronTest < Test::Unit::TestCase
|
13
|
+
|
14
|
+
include Ai4r::Classifiers
|
15
|
+
include Ai4r::Data
|
16
|
+
|
17
|
+
@@data_set = DataSet.new(:data_items =>[ ['New York', '<30', 'M', 'Y'],
|
18
|
+
['Chicago', '<30', 'M', 'Y'],
|
19
|
+
['New York', '<30', 'M', 'Y'],
|
20
|
+
['New York', '[30-50)', 'F', 'N'],
|
21
|
+
['Chicago', '[30-50)', 'F', 'Y'],
|
22
|
+
['New York', '[30-50)', 'F', 'N'],
|
23
|
+
['Chicago', '[50-80]', 'M', 'N'],
|
24
|
+
])
|
25
|
+
|
26
|
+
def test_initialize
|
27
|
+
classifier = MultilayerPerceptron.new
|
28
|
+
assert_equal 1, classifier.active_node_value
|
29
|
+
assert_equal 0, classifier.inactive_node_value
|
30
|
+
assert_equal Ai4r::NeuralNetwork::Backpropagation, classifier.network_class
|
31
|
+
assert_equal [], classifier.hidden_layers
|
32
|
+
assert classifier.network_parameters
|
33
|
+
assert classifier.network_parameters.empty?
|
34
|
+
assert classifier.training_iterations > 1
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_build
|
38
|
+
assert_raise(ArgumentError) { MultilayerPerceptron.new.build(DataSet.new) }
|
39
|
+
classifier = MultilayerPerceptron.new
|
40
|
+
classifier.training_iterations = 1
|
41
|
+
classifier.build(@@data_set)
|
42
|
+
assert_equal [7,2], classifier.network.structure
|
43
|
+
classifier.hidden_layers = [6, 4]
|
44
|
+
classifier.build(@@data_set)
|
45
|
+
assert_equal [7,6,4,2], classifier.network.structure
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_eval
|
49
|
+
classifier = MultilayerPerceptron.new.build(@@data_set)
|
50
|
+
assert classifier
|
51
|
+
assert_equal('N', classifier.eval(['Chicago', '[50-80]', 'M']))
|
52
|
+
assert_equal('N', classifier.eval(['New York', '[30-50)', 'F']))
|
53
|
+
assert_equal('Y', classifier.eval(['New York', '<30', 'M']))
|
54
|
+
assert_equal('Y', classifier.eval(['Chicago', '[30-50)', 'F']))
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_get_rules
|
58
|
+
assert_match(/raise/, MultilayerPerceptron.new.get_rules)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_get_max_index
|
62
|
+
classifier = MultilayerPerceptron.new
|
63
|
+
assert_equal(0, classifier.get_max_index([3, 1, 0.2, -9, 0, 2.99]))
|
64
|
+
assert_equal(2, classifier.get_max_index([3, 1, 5, -9, 0, 2.99]))
|
65
|
+
assert_equal(5, classifier.get_max_index([3, 1, 5, -9, 0, 6]))
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_data_to_output
|
69
|
+
classifier = MultilayerPerceptron.new
|
70
|
+
classifier.outputs = 4
|
71
|
+
classifier.outputs = 4
|
72
|
+
classifier.domains = [nil, nil, nil, ["A", "B", "C", "D"]]
|
73
|
+
assert_equal([1,0,0,0], classifier.data_to_output("A"))
|
74
|
+
assert_equal([0,0,1,0], classifier.data_to_output("C"))
|
75
|
+
assert_equal([0,0,0,1], classifier.data_to_output("D"))
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/average_linkage'
|
3
|
+
|
4
|
+
class Ai4r::Clusterers::AverageLinkage < Ai4r::Clusterers::SingleLinkage
|
5
|
+
attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
|
6
|
+
public :calc_index_clusters_distance
|
7
|
+
public :distance_between_item_and_cluster
|
8
|
+
end
|
9
|
+
|
10
|
+
class AverageLinkageTest < Test::Unit::TestCase
|
11
|
+
|
12
|
+
include Ai4r::Clusterers
|
13
|
+
include Ai4r::Data
|
14
|
+
|
15
|
+
@@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
|
16
|
+
[1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
|
17
|
+
|
18
|
+
@@expected_distance_matrix = [
|
19
|
+
[98.0],
|
20
|
+
[89.0, 5.0],
|
21
|
+
[68.0, 26.0, 9.0],
|
22
|
+
[74.0, 4.0, 1.0, 10.0],
|
23
|
+
[0.0, 98.0, 89.0, 68.0, 74.0],
|
24
|
+
[81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
|
25
|
+
[8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
|
26
|
+
[100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
|
27
|
+
[68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
|
28
|
+
[49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
|
29
|
+
[2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
|
30
|
+
|
31
|
+
def test_calc_index_clusters_distance
|
32
|
+
clusterer = AverageLinkage.new
|
33
|
+
clusterer.distance_matrix = @@expected_distance_matrix
|
34
|
+
assert_equal 98.0, clusterer.calc_index_clusters_distance([0], [1])
|
35
|
+
assert_equal 43.0, clusterer.calc_index_clusters_distance([0, 1], [3, 4])
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_distance_between_item_and_cluster
|
39
|
+
clusterer = AverageLinkage.new
|
40
|
+
assert_equal 20.0, clusterer.distance_between_item_and_cluster([1,2],
|
41
|
+
DataSet.new(:data_items => [[3,4],[5,6]]))
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/complete_linkage'
|
3
|
+
|
4
|
+
class Ai4r::Clusterers::CompleteLinkage
|
5
|
+
attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
|
6
|
+
public :calc_index_clusters_distance
|
7
|
+
public :distance_between_item_and_cluster
|
8
|
+
end
|
9
|
+
|
10
|
+
class CompleteLinkageTest < Test::Unit::TestCase
|
11
|
+
|
12
|
+
include Ai4r::Clusterers
|
13
|
+
include Ai4r::Data
|
14
|
+
|
15
|
+
@@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
|
16
|
+
[1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
|
17
|
+
|
18
|
+
@@expected_distance_matrix = [
|
19
|
+
[98.0],
|
20
|
+
[89.0, 5.0],
|
21
|
+
[68.0, 26.0, 9.0],
|
22
|
+
[74.0, 4.0, 1.0, 10.0],
|
23
|
+
[0.0, 98.0, 89.0, 68.0, 74.0],
|
24
|
+
[81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
|
25
|
+
[8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
|
26
|
+
[100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
|
27
|
+
[68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
|
28
|
+
[49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
|
29
|
+
[2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
|
30
|
+
|
31
|
+
def test_calc_index_clusters_distance
|
32
|
+
clusterer = CompleteLinkage.new
|
33
|
+
clusterer.distance_matrix = @@expected_distance_matrix
|
34
|
+
assert_equal 98.0, clusterer.calc_index_clusters_distance([0], [1])
|
35
|
+
assert_equal 74.0, clusterer.calc_index_clusters_distance([0, 1], [3, 4])
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_distance_between_item_and_cluster
|
39
|
+
clusterer = CompleteLinkage.new
|
40
|
+
assert_equal 32.0, clusterer.distance_between_item_and_cluster([1,2],
|
41
|
+
DataSet.new(:data_items => [[3,4],[5,6]]))
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/clusterers/single_linkage'
|
3
|
+
|
4
|
+
class Ai4r::Clusterers::SingleLinkage
|
5
|
+
attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
|
6
|
+
end
|
7
|
+
|
8
|
+
class Ai4r::Clusterers::SingleLinkageTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
include Ai4r::Clusterers
|
11
|
+
include Ai4r::Data
|
12
|
+
|
13
|
+
@@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
|
14
|
+
[1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
|
15
|
+
|
16
|
+
@@expected_distance_matrix = [
|
17
|
+
[98.0],
|
18
|
+
[89.0, 5.0],
|
19
|
+
[68.0, 26.0, 9.0],
|
20
|
+
[74.0, 4.0, 1.0, 10.0],
|
21
|
+
[0.0, 98.0, 89.0, 68.0, 74.0],
|
22
|
+
[81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
|
23
|
+
[8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
|
24
|
+
[100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
|
25
|
+
[68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
|
26
|
+
[49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
|
27
|
+
[2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
|
28
|
+
|
29
|
+
def setup
|
30
|
+
SingleLinkage.send(:public, *SingleLinkage.protected_instance_methods)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_build
|
34
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
35
|
+
clusterer.build(DataSet.new(:data_items => @@data), 4)
|
36
|
+
#draw_map(clusterer)
|
37
|
+
assert_equal 4, clusterer.clusters.length
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_eval
|
41
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
42
|
+
clusterer.build(DataSet.new(:data_items => @@data), 4)
|
43
|
+
assert_equal 2, clusterer.eval([0,8])
|
44
|
+
assert_equal 0, clusterer.eval([8,0])
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_create_distance_matrix
|
48
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
49
|
+
clusterer.create_distance_matrix(DataSet.new(:data_items => @@data))
|
50
|
+
assert clusterer.distance_matrix
|
51
|
+
clusterer.distance_matrix.each_with_index do |row, row_index|
|
52
|
+
assert_equal row_index+1, row.length
|
53
|
+
end
|
54
|
+
assert_equal @@expected_distance_matrix, clusterer.distance_matrix
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_read_distance_matrix
|
58
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
59
|
+
clusterer.distance_matrix = @@expected_distance_matrix
|
60
|
+
assert_equal 9.0, clusterer.read_distance_matrix(3, 2)
|
61
|
+
assert_equal 9.0, clusterer.read_distance_matrix(2, 3)
|
62
|
+
assert_equal 0, clusterer.read_distance_matrix(5, 5)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_calc_index_clusters_distance
|
66
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
67
|
+
clusterer.distance_matrix = @@expected_distance_matrix
|
68
|
+
assert_equal 98.0, clusterer.calc_index_clusters_distance([0], [1])
|
69
|
+
assert_equal 4.0, clusterer.calc_index_clusters_distance([0, 1], [3, 4])
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_get_closest_clusters
|
73
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
74
|
+
clusterer.distance_matrix = @@expected_distance_matrix
|
75
|
+
assert_equal [1,0], clusterer.get_closest_clusters([[0,1], [3,4]])
|
76
|
+
assert_equal [2,1], clusterer.get_closest_clusters([[3,4], [0,1], [5,6]])
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_create_initial_index_clusters
|
80
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
81
|
+
clusterer.data_set = DataSet.new :data_items => @@data
|
82
|
+
index_clusters = clusterer.create_initial_index_clusters
|
83
|
+
assert_equal @@data.length, index_clusters.length
|
84
|
+
assert_equal 0, index_clusters.first.first
|
85
|
+
assert_equal @@data.length-1, index_clusters.last.first
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_merge_clusters
|
89
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
90
|
+
clusters = clusterer.merge_clusters([1,2], [[1,2],[3,4],[5,6]])
|
91
|
+
assert_equal [[1,2], [3,4,5,6]], clusters.collect {|x| x.sort}
|
92
|
+
clusters = clusterer.merge_clusters([2,1], [[1,2],[3,4],[5,6]])
|
93
|
+
assert_equal [[1,2], [3,4,5,6]], clusters.collect {|x| x.sort}
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_distance_between_item_and_cluster
|
97
|
+
clusterer = Ai4r::Clusterers::SingleLinkage.new
|
98
|
+
assert_equal 8.0, clusterer.distance_between_item_and_cluster([1,2],
|
99
|
+
DataSet.new(:data_items => [[3,4],[5,6]]))
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
def draw_map(clusterer)
|
104
|
+
map = Array.new(11) {Array.new(11, 0)}
|
105
|
+
clusterer.clusters.each_index do |i|
|
106
|
+
clusterer.clusters[i].data_items.each do |point|
|
107
|
+
map[point.first][point.last]=(i+1)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
map.each { |row| puts row.inspect}
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
data/test/data/data_set_test.rb
CHANGED
@@ -14,8 +14,8 @@ module Ai4r
|
|
14
14
|
module Data
|
15
15
|
class DataSetTest < Test::Unit::TestCase
|
16
16
|
|
17
|
-
def
|
18
|
-
set = DataSet.new.
|
17
|
+
def test_load_csv_with_labels
|
18
|
+
set = DataSet.new.load_csv_with_labels("#{File.dirname(__FILE__)}/data_set.csv")
|
19
19
|
assert_equal 120, set.data_items.length
|
20
20
|
assert_equal ["zone", "rooms", "size", "price"], set.data_labels
|
21
21
|
end
|
@@ -63,19 +63,7 @@ module Ai4r
|
|
63
63
|
assert_raise(ArgumentError) { set.set_data_items(nil) }
|
64
64
|
assert_raise(ArgumentError) { set.set_data_items([1]) }
|
65
65
|
end
|
66
|
-
|
67
|
-
def test_get_attribute_mean_or_mode
|
68
|
-
items = [ [ "New York", 25, "Y"],
|
69
|
-
[ "New York", 55, "Y"],
|
70
|
-
[ "Chicago", 23, "Y"],
|
71
|
-
[ "Boston", 23, "N"],
|
72
|
-
[ "Chicago", 12, "N"],
|
73
|
-
[ "Chicago", 87, "Y"] ]
|
74
|
-
set = DataSet.new.set_data_items(items)
|
75
|
-
assert_equal "Chicago", set.get_attribute_mean_or_mode(0)
|
76
|
-
assert_equal 37.5, set.get_attribute_mean_or_mode(1)
|
77
|
-
end
|
78
|
-
|
66
|
+
|
79
67
|
def test_get_mean_or_mode
|
80
68
|
items = [ [ "New York", 25, "Y"],
|
81
69
|
[ "New York", 55, "Y"],
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Author:: Sergio Fierens
|
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/data/proximity'
|
12
|
+
|
13
|
+
module Ai4r
|
14
|
+
module Data
|
15
|
+
class ProximityTest < Test::Unit::TestCase
|
16
|
+
|
17
|
+
@@delta = 0.0001
|
18
|
+
@@data1 = [rand*10, rand*10, rand*-10]
|
19
|
+
@@data2 = [rand*10, rand*-10, rand*10]
|
20
|
+
|
21
|
+
def test_squared_euclidean_distance
|
22
|
+
assert_equal 0, Proximity.squared_euclidean_distance(@@data1, @@data1)
|
23
|
+
assert_equal Proximity.squared_euclidean_distance(@@data1, @@data2),
|
24
|
+
Proximity.squared_euclidean_distance(@@data2, @@data1)
|
25
|
+
assert 0 <= Proximity.squared_euclidean_distance(@@data1, @@data1)
|
26
|
+
assert_equal 2, Proximity.squared_euclidean_distance([1,1], [2,2])
|
27
|
+
assert_equal 9, Proximity.squared_euclidean_distance([3], [0])
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_euclidean_distance
|
31
|
+
assert_equal 0, Proximity.euclidean_distance(@@data1, @@data1)
|
32
|
+
assert_equal Proximity.euclidean_distance(@@data1, @@data2),
|
33
|
+
Proximity.euclidean_distance(@@data2, @@data1)
|
34
|
+
assert 0 <= Proximity.euclidean_distance(@@data1, @@data1)
|
35
|
+
assert_equal Math.sqrt(2), Proximity.euclidean_distance([1,1], [2,2])
|
36
|
+
assert_equal 3, Proximity.euclidean_distance([3], [0])
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_manhattan_distance
|
40
|
+
assert_equal 0, Proximity.manhattan_distance(@@data1, @@data1)
|
41
|
+
assert_equal Proximity.manhattan_distance(@@data1, @@data2),
|
42
|
+
Proximity.manhattan_distance(@@data2, @@data1)
|
43
|
+
assert 0 <= Proximity.manhattan_distance(@@data1, @@data1)
|
44
|
+
assert_equal 2, Proximity.manhattan_distance([1,1], [2,2])
|
45
|
+
assert_equal 9, Proximity.manhattan_distance([1,10], [2,2])
|
46
|
+
assert_equal 3, Proximity.manhattan_distance([3], [0])
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_sup_distance
|
50
|
+
assert_equal 0, Proximity.sup_distance(@@data1, @@data1)
|
51
|
+
assert_equal Proximity.sup_distance(@@data1, @@data2),
|
52
|
+
Proximity.sup_distance(@@data2, @@data1)
|
53
|
+
assert 0 <= Proximity.sup_distance(@@data1, @@data1)
|
54
|
+
assert_equal 1, Proximity.sup_distance([1,1], [2,2])
|
55
|
+
assert_equal 8, Proximity.sup_distance([1,10], [2,2])
|
56
|
+
assert_equal 3, Proximity.sup_distance([3], [0])
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_hamming_distance
|
60
|
+
assert_equal 0, Proximity.hamming_distance(@@data1, @@data1)
|
61
|
+
assert_equal Proximity.hamming_distance(@@data1, @@data2),
|
62
|
+
Proximity.hamming_distance(@@data2, @@data1)
|
63
|
+
assert 0 <= Proximity.hamming_distance(@@data1, @@data1)
|
64
|
+
assert_equal 1, Proximity.hamming_distance([1,1], [0,1])
|
65
|
+
assert_equal 2, Proximity.hamming_distance([1,10], [2,2])
|
66
|
+
assert_equal 1, Proximity.hamming_distance([3], [0])
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|