ai4ruby 1.11
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 +47 -0
- data/examples/classifiers/id3_data.csv +121 -0
- data/examples/classifiers/id3_example.rb +29 -0
- data/examples/classifiers/naive_bayes_data.csv +11 -0
- data/examples/classifiers/naive_bayes_example.rb +16 -0
- data/examples/classifiers/results.txt +31 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +37 -0
- data/examples/genetic_algorithm/travel_cost.csv +16 -0
- data/examples/neural_network/backpropagation_example.rb +67 -0
- data/examples/neural_network/patterns_with_base_noise.rb +68 -0
- data/examples/neural_network/patterns_with_noise.rb +66 -0
- data/examples/neural_network/training_patterns.rb +68 -0
- data/examples/neural_network/xor_example.rb +35 -0
- data/examples/som/som_data.rb +156 -0
- data/examples/som/som_multi_node_example.rb +22 -0
- data/examples/som/som_single_example.rb +24 -0
- data/lib/ai4r.rb +33 -0
- data/lib/ai4r/classifiers/classifier.rb +62 -0
- data/lib/ai4r/classifiers/hyperpipes.rb +118 -0
- data/lib/ai4r/classifiers/ib1.rb +121 -0
- data/lib/ai4r/classifiers/id3.rb +326 -0
- data/lib/ai4r/classifiers/multilayer_perceptron.rb +135 -0
- data/lib/ai4r/classifiers/naive_bayes.rb +259 -0
- data/lib/ai4r/classifiers/one_r.rb +110 -0
- data/lib/ai4r/classifiers/prism.rb +197 -0
- data/lib/ai4r/classifiers/zero_r.rb +73 -0
- data/lib/ai4r/clusterers/average_linkage.rb +59 -0
- data/lib/ai4r/clusterers/bisecting_k_means.rb +93 -0
- data/lib/ai4r/clusterers/centroid_linkage.rb +66 -0
- data/lib/ai4r/clusterers/clusterer.rb +61 -0
- data/lib/ai4r/clusterers/complete_linkage.rb +67 -0
- data/lib/ai4r/clusterers/diana.rb +139 -0
- data/lib/ai4r/clusterers/k_means.rb +126 -0
- data/lib/ai4r/clusterers/median_linkage.rb +61 -0
- data/lib/ai4r/clusterers/single_linkage.rb +194 -0
- data/lib/ai4r/clusterers/ward_linkage.rb +64 -0
- data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +31 -0
- data/lib/ai4r/clusterers/weighted_average_linkage.rb +61 -0
- data/lib/ai4r/data/data_set.rb +266 -0
- data/lib/ai4r/data/parameterizable.rb +64 -0
- data/lib/ai4r/data/proximity.rb +100 -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 +270 -0
- data/lib/ai4r/neural_network/backpropagation.rb +326 -0
- data/lib/ai4r/neural_network/hopfield.rb +149 -0
- data/lib/ai4r/som/layer.rb +68 -0
- data/lib/ai4r/som/node.rb +96 -0
- data/lib/ai4r/som/som.rb +155 -0
- data/lib/ai4r/som/two_phase_layer.rb +90 -0
- data/test/classifiers/hyperpipes_test.rb +84 -0
- data/test/classifiers/ib1_test.rb +78 -0
- data/test/classifiers/id3_test.rb +208 -0
- data/test/classifiers/multilayer_perceptron_test.rb +79 -0
- data/test/classifiers/naive_bayes_test.rb +43 -0
- data/test/classifiers/one_r_test.rb +62 -0
- data/test/classifiers/prism_test.rb +85 -0
- data/test/classifiers/zero_r_test.rb +49 -0
- data/test/clusterers/average_linkage_test.rb +51 -0
- data/test/clusterers/bisecting_k_means_test.rb +66 -0
- data/test/clusterers/centroid_linkage_test.rb +53 -0
- data/test/clusterers/complete_linkage_test.rb +57 -0
- data/test/clusterers/diana_test.rb +69 -0
- data/test/clusterers/k_means_test.rb +100 -0
- data/test/clusterers/median_linkage_test.rb +53 -0
- data/test/clusterers/single_linkage_test.rb +122 -0
- data/test/clusterers/ward_linkage_hierarchical_test.rb +61 -0
- data/test/clusterers/ward_linkage_test.rb +53 -0
- data/test/clusterers/weighted_average_linkage_test.rb +53 -0
- data/test/data/data_set_test.rb +96 -0
- data/test/data/proximity_test.rb +81 -0
- data/test/data/statistics_test.rb +65 -0
- data/test/experiment/classifier_evaluator_test.rb +76 -0
- data/test/genetic_algorithm/chromosome_test.rb +58 -0
- data/test/genetic_algorithm/genetic_algorithm_test.rb +81 -0
- data/test/neural_network/backpropagation_test.rb +82 -0
- data/test/neural_network/hopfield_test.rb +72 -0
- data/test/som/som_test.rb +97 -0
- metadata +168 -0
data/README.rdoc
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
= Introduction
|
2
|
+
|
3
|
+
This project aims to produce ruby implementations of
|
4
|
+
algorithms covering several Artificial intelligence fields.
|
5
|
+
|
6
|
+
= Where can I find the lastest code and info on this project?
|
7
|
+
|
8
|
+
http://ai4r.rubyforge.org
|
9
|
+
|
10
|
+
= How to install
|
11
|
+
|
12
|
+
1. Install the gem:
|
13
|
+
|
14
|
+
gem install ai4r
|
15
|
+
|
16
|
+
2. Include require statements in your code:
|
17
|
+
|
18
|
+
require "rubygems"
|
19
|
+
require "ai4r"
|
20
|
+
|
21
|
+
= More Info
|
22
|
+
|
23
|
+
* AI4R Project site: http://ai4r.rubyforge.org
|
24
|
+
|
25
|
+
= Contact
|
26
|
+
|
27
|
+
If you have questions or constructive comments about this project send it to me:
|
28
|
+
Sergio Fierens, email address: (sergio (at) gmail (dot) com).
|
29
|
+
|
30
|
+
= Contributors
|
31
|
+
|
32
|
+
* Thomas Kern (SOM implementation and examples)
|
33
|
+
* Sergio Fierens
|
34
|
+
|
35
|
+
= Disclaimer
|
36
|
+
|
37
|
+
In plain english:
|
38
|
+
|
39
|
+
This project was created by Sergio Fierens, but the AI algorithms were created by other
|
40
|
+
people who are actually much more clever than Sergio. He does his best implementing
|
41
|
+
them, but he cannot warranty that these implementations are accurate.
|
42
|
+
|
43
|
+
In legalese:
|
44
|
+
|
45
|
+
This software is provided "as is" and without any express or implied warranties,
|
46
|
+
including, without limitation, the implied warranties of merchantibility and
|
47
|
+
fitness for a particular purpose.
|
@@ -0,0 +1,121 @@
|
|
1
|
+
zone,rooms,size,price
|
2
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
3
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
4
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
5
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
6
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
7
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
8
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
9
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[36K-45K]
|
10
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[36K-45K]
|
11
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[36K-45K]
|
12
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[29K-35K]
|
13
|
+
Moron Sur (GBA),2,[28 m2 - 39 m2],[36K-45K]
|
14
|
+
Moron Sur (GBA),2,[40 m2 - 50 m2],[36K-45K]
|
15
|
+
Moron Sur (GBA),2,[40 m2 - 50 m2],[29K-35K]
|
16
|
+
Moron Sur (GBA),2,[40 m2 - 50 m2],[29K-35K]
|
17
|
+
Moron Sur (GBA),2,[40 m2 - 50 m2],[56K-75K]
|
18
|
+
Moron Sur (GBA),3,[40 m2 - 50 m2],[36K-45K]
|
19
|
+
Moron Sur (GBA),2,[40 m2 - 50 m2],[29K-35K]
|
20
|
+
Moron Sur (GBA),2,[51 m2 - 59 m2],[36K-45K]
|
21
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[46K-55K]
|
22
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[36K-45K]
|
23
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[36K-45K]
|
24
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[36K-45K]
|
25
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[36K-45K]
|
26
|
+
Moron Sur (GBA),3,[51 m2 - 59 m2],[46K-55K]
|
27
|
+
Moron Sur (GBA),2,[51 m2 - 59 m2],[46K-55K]
|
28
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[46K-55K]
|
29
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[46K-55K]
|
30
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[56K-75K]
|
31
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[56K-75K]
|
32
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[36K-45K]
|
33
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[36K-45K]
|
34
|
+
Moron Sur (GBA),3,[60 m2 - 70 m2],[56K-75K]
|
35
|
+
Moron Sur (GBA),3,[71 m2 - 85 m2],[46K-55K]
|
36
|
+
Moron Sur (GBA),3,[86 m2 - 100 m2],[46K-55K]
|
37
|
+
Moron Sur (GBA),4,[101 m2 - 125 m2],[101K-125K]
|
38
|
+
Moron Sur (GBA),3,[101 m2 - 125 m2],[76K-100K]
|
39
|
+
Moron Sur (GBA),4,[101 m2 - 125 m2],[170K-200K]
|
40
|
+
Moron Sur (GBA),4,[101 m2 - 125 m2],[76K-100K]
|
41
|
+
Moron Sur (GBA),4,[126 m2 - 160 m2],[56K-75K]
|
42
|
+
Moron Sur (GBA),4,[126 m2 - 160 m2],[126K-150K]
|
43
|
+
Recoleta (CABA),2,[28 m2 - 39 m2],[46K-55K]
|
44
|
+
Recoleta (CABA),2,[28 m2 - 39 m2],[56K-75K]
|
45
|
+
Recoleta (CABA),2,[28 m2 - 39 m2],[56K-75K]
|
46
|
+
Recoleta (CABA),2,[28 m2 - 39 m2],[46K-55K]
|
47
|
+
Recoleta (CABA),2,[40 m2 - 50 m2],[56K-75K]
|
48
|
+
Recoleta (CABA),2,[40 m2 - 50 m2],[76K-100K]
|
49
|
+
Recoleta (CABA),2,[40 m2 - 50 m2],[76K-100K]
|
50
|
+
Recoleta (CABA),2,[40 m2 - 50 m2],[56K-75K]
|
51
|
+
Recoleta (CABA),2,[40 m2 - 50 m2],[101K-125K]
|
52
|
+
Recoleta (CABA),2,[51 m2 - 59 m2],[101K-125K]
|
53
|
+
Recoleta (CABA),2,[51 m2 - 59 m2],[56K-75K]
|
54
|
+
Recoleta (CABA),2,[51 m2 - 59 m2],[76K-100K]
|
55
|
+
Recoleta (CABA),2,[51 m2 - 59 m2],[76K-100K]
|
56
|
+
Recoleta (CABA),2,[60 m2 - 70 m2],[56K-75K]
|
57
|
+
Recoleta (CABA),2,[60 m2 - 70 m2],[76K-100K]
|
58
|
+
Recoleta (CABA),3,[60 m2 - 70 m2],[101K-125K]
|
59
|
+
Recoleta (CABA),2,[60 m2 - 70 m2],[76K-100K]
|
60
|
+
Recoleta (CABA),2,[60 m2 - 70 m2],[76K-100K]
|
61
|
+
Recoleta (CABA),2,[60 m2 - 70 m2],[126K-150K]
|
62
|
+
Recoleta (CABA),3,[60 m2 - 70 m2],[76K-100K]
|
63
|
+
Recoleta (CABA),3,[60 m2 - 70 m2],[76K-100K]
|
64
|
+
Recoleta (CABA),2,[71 m2 - 85 m2],[152K-169K]
|
65
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[126K-150K]
|
66
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[152K-169K]
|
67
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[170K-200K]
|
68
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[101K-125K]
|
69
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[170K-200K]
|
70
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[76K-100K]
|
71
|
+
Recoleta (CABA),2,[71 m2 - 85 m2],[126K-150K]
|
72
|
+
Recoleta (CABA),3,[71 m2 - 85 m2],[126K-150K]
|
73
|
+
Recoleta (CABA),2,[71 m2 - 85 m2],[200K-275K]
|
74
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[152K-169K]
|
75
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[170K-200K]
|
76
|
+
Recoleta (CABA),4,[86 m2 - 100 m2],[126K-150K]
|
77
|
+
Recoleta (CABA),4,[86 m2 - 100 m2],[126K-150K]
|
78
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[200K-275K]
|
79
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[126K-150K]
|
80
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[152K-169K]
|
81
|
+
Recoleta (CABA),3,[86 m2 - 100 m2],[200K-275K]
|
82
|
+
Recoleta (CABA),3,[101 m2 - 125 m2],[200K-275K]
|
83
|
+
Recoleta (CABA),3,[101 m2 - 125 m2],[170K-200K]
|
84
|
+
Recoleta (CABA),4,[101 m2 - 125 m2],[170K-200K]
|
85
|
+
Recoleta (CABA),4,[101 m2 - 125 m2],[200K-275K]
|
86
|
+
Recoleta (CABA),3,[101 m2 - 125 m2],[56K-75K]
|
87
|
+
Recoleta (CABA),4,[101 m2 - 125 m2],[200K-275K]
|
88
|
+
Recoleta (CABA),4,[101 m2 - 125 m2],[170K-200K]
|
89
|
+
Recoleta (CABA),3,[126 m2 - 160 m2],[200K-275K]
|
90
|
+
Recoleta (CABA),4,[126 m2 - 160 m2],[200K-275K]
|
91
|
+
Recoleta (CABA),3,[126 m2 - 160 m2],[152K-169K]
|
92
|
+
Recoleta (CABA),3,[126 m2 - 160 m2],[200K-275K]
|
93
|
+
Recoleta (CABA),4,[126 m2 - 160 m2],>275K
|
94
|
+
Recoleta (CABA),3,[126 m2 - 160 m2],[200K-275K]
|
95
|
+
Recoleta (CABA),4,[126 m2 - 160 m2],>275K
|
96
|
+
Recoleta (CABA),3,[126 m2 - 160 m2],[170K-200K]
|
97
|
+
Tigre (GBA),2,[28 m2 - 39 m2],[56K-75K]
|
98
|
+
Tigre (GBA),2,[40 m2 - 50 m2],[56K-75K]
|
99
|
+
Tigre (GBA),2,[40 m2 - 50 m2],[76K-100K]
|
100
|
+
Tigre (GBA),2,[51 m2 - 59 m2],[101K-125K]
|
101
|
+
Tigre (GBA),2,[51 m2 - 59 m2],[101K-125K]
|
102
|
+
Tigre (GBA),3,[51 m2 - 59 m2],[101K-125K]
|
103
|
+
Tigre (GBA),3,[51 m2 - 59 m2],[101K-125K]
|
104
|
+
Tigre (GBA),3,[51 m2 - 59 m2],[126K-150K]
|
105
|
+
Tigre (GBA),2,[71 m2 - 85 m2],[126K-150K]
|
106
|
+
Tigre (GBA),2,[71 m2 - 85 m2],[126K-150K]
|
107
|
+
Tigre (GBA),2,[71 m2 - 85 m2],[126K-150K]
|
108
|
+
Tigre (GBA),3,[86 m2 - 100 m2],[170K-200K]
|
109
|
+
Tigre (GBA),4,[86 m2 - 100 m2],[152K-169K]
|
110
|
+
Tigre (GBA),4,[86 m2 - 100 m2],[152K-169K]
|
111
|
+
Tigre (GBA),3,[86 m2 - 100 m2],[152K-169K]
|
112
|
+
Tigre (GBA),3,[86 m2 - 100 m2],[152K-169K]
|
113
|
+
Tigre (GBA),3,[101 m2 - 125 m2],[152K-169K]
|
114
|
+
Tigre (GBA),4,[101 m2 - 125 m2],[170K-200K]
|
115
|
+
Tigre (GBA),4,[101 m2 - 125 m2],[170K-200K]
|
116
|
+
Tigre (GBA),4,[101 m2 - 125 m2],[200K-275K]
|
117
|
+
Tigre (GBA),4,[101 m2 - 125 m2],[200K-275K]
|
118
|
+
Tigre (GBA),4,[101 m2 - 125 m2],[170K-200K]
|
119
|
+
Tigre (GBA),4,[101 m2 - 125 m2],>275K
|
120
|
+
Tigre (GBA),4,[101 m2 - 125 m2],>275K
|
121
|
+
Tigre (GBA),4,[126 m2 - 160 m2],>275K
|
@@ -0,0 +1,29 @@
|
|
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 File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/id3'
|
11
|
+
|
12
|
+
# Load data from data_set.csv
|
13
|
+
data_filename = "#{File.dirname(__FILE__)}/id3_data.csv"
|
14
|
+
data_set = Ai4r::Data::DataSet.new.load_csv_with_labels data_filename
|
15
|
+
|
16
|
+
# Build ID3 tree
|
17
|
+
id3 = Ai4r::Classifiers::ID3.new.build(data_set)
|
18
|
+
|
19
|
+
# Show rules
|
20
|
+
puts "Discovered rules are:"
|
21
|
+
puts id3.get_rules
|
22
|
+
puts
|
23
|
+
|
24
|
+
# Try to predict some values
|
25
|
+
puts "Prediction samples:"
|
26
|
+
puts "['Moron Sur (GBA)','4','[86 m2 - 100 m2]'] => " + id3.eval(['Moron Sur (GBA)','4','[86 m2 - 100 m2]'])
|
27
|
+
puts "['Moron Sur (GBA)','3','[101 m2 - 125 m2]'] => " + id3.eval(['Moron Sur (GBA)','3','[101 m2 - 125 m2]'])
|
28
|
+
puts "['Recoleta (CABA)','3','[86 m2 - 100 m2]'] => " + id3.eval(['Recoleta (CABA)','3','[86 m2 - 100 m2]',])
|
29
|
+
puts "['Tigre (GBA)','3','[71 m2 - 85 m2]'] => " + id3.eval(['Tigre (GBA)','3','[71 m2 - 85 m2]',])
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"Color","Type","Origin","Stolen?"
|
2
|
+
"Red","Sports","Domestic","Yes"
|
3
|
+
"Red","Sports","Domestic","No"
|
4
|
+
"Red","Sports","Domestic","Yes"
|
5
|
+
"Yellow","Sports","Domestic","No"
|
6
|
+
"Yellow","Sports","Imported","Yes"
|
7
|
+
"Yellow","SUV","Imported","No"
|
8
|
+
"Yellow","SUV","Imported","Yes"
|
9
|
+
"Yellow","Sports","Domestic","No"
|
10
|
+
"Red","SUV","Imported","No"
|
11
|
+
"Red","Sports","Imported","Yes"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/naive_bayes'
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
|
3
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/id3'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
include Ai4r::Classifiers
|
7
|
+
include Ai4r::Data
|
8
|
+
|
9
|
+
data_set = DataSet.new
|
10
|
+
data_set.load_csv_with_labels File.dirname(__FILE__) + "/naive_bayes_data.csv"
|
11
|
+
|
12
|
+
b = NaiveBayes.new.
|
13
|
+
set_parameters({:m=>3}).
|
14
|
+
build data_set
|
15
|
+
p b.eval(["Red", "SUV", "Domestic"])
|
16
|
+
p b.get_probability_map(["Red", "SUV", "Domestic"])
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Discovered rules are:
|
2
|
+
if size=='[28 m2 - 39 m2]' and zone=='Moron Sur (GBA)' then price='[29K-35K]'
|
3
|
+
elsif size=='[28 m2 - 39 m2]' and zone=='Recoleta (CABA)' then price='[46K-55K]'
|
4
|
+
elsif size=='[28 m2 - 39 m2]' and zone=='Tigre (GBA)' then price='[56K-75K]'
|
5
|
+
elsif size=='[40 m2 - 50 m2]' and zone=='Moron Sur (GBA)' then price='[29K-35K]'
|
6
|
+
elsif size=='[40 m2 - 50 m2]' and zone=='Recoleta (CABA)' then price='[56K-75K]'
|
7
|
+
elsif size=='[40 m2 - 50 m2]' and zone=='Tigre (GBA)' then price='[56K-75K]'
|
8
|
+
elsif size=='[51 m2 - 59 m2]' and zone=='Moron Sur (GBA)' then price='[36K-45K]'
|
9
|
+
elsif size=='[51 m2 - 59 m2]' and zone=='Recoleta (CABA)' then price='[76K-100K]'
|
10
|
+
elsif size=='[51 m2 - 59 m2]' and zone=='Tigre (GBA)' then price='[101K-125K]'
|
11
|
+
elsif size=='[60 m2 - 70 m2]' and zone=='Moron Sur (GBA)' then price='[56K-75K]'
|
12
|
+
elsif size=='[60 m2 - 70 m2]' and zone=='Recoleta (CABA)' then price='[76K-100K]'
|
13
|
+
elsif size=='[71 m2 - 85 m2]' and zone=='Moron Sur (GBA)' then price='[46K-55K]'
|
14
|
+
elsif size=='[71 m2 - 85 m2]' and zone=='Recoleta (CABA)' then price='[126K-150K]'
|
15
|
+
elsif size=='[71 m2 - 85 m2]' and zone=='Tigre (GBA)' then price='[126K-150K]'
|
16
|
+
elsif size=='[86 m2 - 100 m2]' and zone=='Moron Sur (GBA)' then price='[46K-55K]'
|
17
|
+
elsif size=='[86 m2 - 100 m2]' and zone=='Recoleta (CABA)' then price='[126K-150K]'
|
18
|
+
elsif size=='[86 m2 - 100 m2]' and zone=='Tigre (GBA)' then price='[152K-169K]'
|
19
|
+
elsif size=='[101 m2 - 125 m2]' and zone=='Moron Sur (GBA)' then price='[76K-100K]'
|
20
|
+
elsif size=='[101 m2 - 125 m2]' and zone=='Recoleta (CABA)' then price='[200K-275K]'
|
21
|
+
elsif size=='[101 m2 - 125 m2]' and zone=='Tigre (GBA)' then price='[170K-200K]'
|
22
|
+
elsif size=='[126 m2 - 160 m2]' and zone=='Moron Sur (GBA)' then price='[56K-75K]'
|
23
|
+
elsif size=='[126 m2 - 160 m2]' and zone=='Recoleta (CABA)' then price='[200K-275K]'
|
24
|
+
elsif size=='[126 m2 - 160 m2]' and zone=='Tigre (GBA)' then price='>275K'
|
25
|
+
else raise 'There was not enough information during training to do a proper induction for this data element' end
|
26
|
+
|
27
|
+
Prediction samples:
|
28
|
+
['Moron Sur (GBA)','4','[86 m2 - 100 m2]'] => [46K-55K]
|
29
|
+
['Moron Sur (GBA)','3','[101 m2 - 125 m2]'] => [76K-100K]
|
30
|
+
['Recoleta (CABA)','3','[86 m2 - 100 m2]'] => [126K-150K]
|
31
|
+
['Tigre (GBA)','3','[71 m2 - 85 m2]'] => [126K-150K]
|
@@ -0,0 +1,37 @@
|
|
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 File.dirname(__FILE__) + '/../../lib/ai4r/genetic_algorithm/genetic_algorithm'
|
11
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
|
12
|
+
require 'csv'
|
13
|
+
|
14
|
+
# Load data from data_set.csv
|
15
|
+
data_filename = "#{File.dirname(__FILE__)}/travel_cost.csv"
|
16
|
+
data_set = Ai4r::Data::DataSet.new.load_csv_with_labels data_filename
|
17
|
+
data_set.data_items.collect! {|column| column.collect {|element| element.to_f}}
|
18
|
+
|
19
|
+
Ai4r::GeneticAlgorithm::Chromosome.set_cost_matrix(data_set.data_items)
|
20
|
+
|
21
|
+
puts "Some random selected tours costs: "
|
22
|
+
3.times do
|
23
|
+
c = Ai4r::GeneticAlgorithm::Chromosome.seed
|
24
|
+
puts "COST #{-1 * c.fitness} TOUR: "+
|
25
|
+
"#{c.data.collect{|c| data_set.data_labels[c]} * ', '}"
|
26
|
+
end
|
27
|
+
|
28
|
+
puts "Beginning genetic search, please wait... "
|
29
|
+
search = Ai4r::GeneticAlgorithm::GeneticSearch.new(800, 100)
|
30
|
+
result = search.run
|
31
|
+
puts "COST #{-1 * result.fitness} TOUR: "+
|
32
|
+
"#{result.data.collect{|c| data_set.data_labels[c]} * ', '}"
|
33
|
+
|
34
|
+
# $7611.99 TOUR: Moscow, Kiev, Warsaw, Hamburg, Berlin, Vienna, Munich, Milan, Rome, Barcelona, Madrid, Paris, Brussels, London, Dublin
|
35
|
+
# $7659.81 TOUR: Moscow, Kiev, Warsaw, Vienna, Munich, Berlin, Hamburg, Brussels, Dublin, London, Paris, Milan, Rome, Barcelona, Madrid
|
36
|
+
# $7596.74 TOUR: Moscow, Kiev, Warsaw, Berlin, Hamburg, Vienna, Munich, Milan, Rome, Barcelona, Madrid, Paris, Brussels, London Dublin
|
37
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"Barcelona","Berlin","Brussels","Dublin","Hamburg","Kiev","London","Madrid","Milan","Moscow","Munich","Paris","Rome","Vienna","Warsaw"
|
2
|
+
0,"1497.61","1062.89","1469.29","1471.78","2391.06","1137.67","504.64","725.12","3006.93","1054.55","831.59","856.69","1347.43","1862.33"
|
3
|
+
"1497.61",0,"651.62","1315.16","254.51","1204.00","929.97","1867.69","840.72","1607.99","501.97","876.96","1181.67","523.61","516.06"
|
4
|
+
"1062.89","651.62",0,"773.20","489.76","1836.20","318.72","1314.30","696.61","2253.26","601.87","261.29","1171.34","914.81","1159.85"
|
5
|
+
"1469.29","1315.16","773.20",0,"1073.36","2513.69","462.60","1449.96","1413.37","2792.41","1374.91","776.83","1882.22","1680.00","1823.72"
|
6
|
+
"1471.78","254.51","489.76","1073.36",0,"1440.34","720.12","1785.33","900.01","1779.93","610.17","744.63","1307.51","742.79","750.49"
|
7
|
+
"2391.06","1204.00","1836.20","2513.69","1440.34",0,"2131.20","2859.32","1672.69","756.61","1391.36","2022.76","1673.74","1052.76","690.12"
|
8
|
+
"1137.67","929.97","318.72","462.60","720.12","2131.20",0,"1263.37","957.91","2498.32","916.23","340.55","1431.21","1233.48","1445.85"
|
9
|
+
"504.64","1867.69","1314.30","1449.96","1785.33","2859.32","1263.37",0,"1187.73","3437.70","1484.53","1053.40","1360.80","1807.09","2288.42"
|
10
|
+
"725.12","840.72","696.61","1413.37","900.01","1672.69","957.91","1187.73",0,"2283.19","348.89","641.31","476.00","623.36","1143.01"
|
11
|
+
"3006.93","1607.99","2253.26","2792.41","1779.93","756.61","2498.32","3437.70","2283.19",0,"1957.15","2484.92","2374.26","1669.22","1149.41"
|
12
|
+
"1054.55","501.97","601.87","1374.91","610.17","1391.36","916.23","1484.53","348.89","1957.15",0,"685.14","698.04","354.42","809.02"
|
13
|
+
"831.59","876.96","261.29","776.83","744.63","2022.76","340.55","1053.40","641.31","2484.92","685.14",0,"1105.76","1033.73","1365.91"
|
14
|
+
"856.69","1181.67","1171.34","1882.22","1307.51","1673.74","1431.21","1360.80","476.00","2374.26","698.04","1105.76",0,"763.26","1316.24"
|
15
|
+
"1347.43","523.61","914.81","1680.00","742.79","1052.76","1233.48","1807.09","623.36","1669.22","354.42","1033.73","763.26",0,"557.43"
|
16
|
+
"1862.33","516.06","1159.85","1823.72","750.49","690.12","1445.85","2288.42","1143.01","1149.41","809.02","1365.91","1316.24","557.43",0
|
@@ -0,0 +1,67 @@
|
|
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 File.dirname(__FILE__) + '/training_patterns'
|
11
|
+
require File.dirname(__FILE__) + '/patterns_with_noise'
|
12
|
+
require File.dirname(__FILE__) + '/patterns_with_base_noise'
|
13
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/neural_network/backpropagation'
|
14
|
+
require 'benchmark'
|
15
|
+
|
16
|
+
times = Benchmark.measure do
|
17
|
+
|
18
|
+
srand 1
|
19
|
+
|
20
|
+
net = Ai4r::NeuralNetwork::Backpropagation.new([256, 3])
|
21
|
+
|
22
|
+
tr_input = TRIANGLE.flatten.collect { |input| input.to_f / 5.0}
|
23
|
+
sq_input = SQUARE.flatten.collect { |input| input.to_f / 5.0}
|
24
|
+
cr_input = CROSS.flatten.collect { |input| input.to_f / 5.0}
|
25
|
+
|
26
|
+
tr_with_noise = TRIANGLE_WITH_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
27
|
+
sq_with_noise = SQUARE_WITH_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
28
|
+
cr_with_noise = CROSS_WITH_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
29
|
+
|
30
|
+
tr_with_base_noise = TRIANGLE_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
31
|
+
sq_with_base_noise = SQUARE_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
32
|
+
cr_with_base_noise = CROSS_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 5.0}
|
33
|
+
|
34
|
+
puts "Training the network, please wait."
|
35
|
+
101.times do |i|
|
36
|
+
error = net.train(tr_input, [1,0,0])
|
37
|
+
error = net.train(sq_input, [0,1,0])
|
38
|
+
error = net.train(cr_input, [0,0,1])
|
39
|
+
puts "Error after iteration #{i}:\t#{error}" if i%20 == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def result_label(result)
|
43
|
+
if result[0] > result[1] && result[0] > result[2]
|
44
|
+
"TRIANGLE"
|
45
|
+
elsif result[1] > result[2]
|
46
|
+
"SQUARE"
|
47
|
+
else
|
48
|
+
"CROSS"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
puts "Training Examples"
|
53
|
+
puts "#{net.eval(tr_input).inspect} => #{result_label(net.eval(tr_input))}"
|
54
|
+
puts "#{net.eval(sq_input).inspect} => #{result_label(net.eval(sq_input))}"
|
55
|
+
puts "#{net.eval(cr_input).inspect} => #{result_label(net.eval(cr_input))}"
|
56
|
+
puts "Examples with noise"
|
57
|
+
puts "#{net.eval(tr_with_noise).inspect} => #{result_label(net.eval(tr_with_noise))}"
|
58
|
+
puts "#{net.eval(sq_with_noise).inspect} => #{result_label(net.eval(sq_with_noise))}"
|
59
|
+
puts "#{net.eval(cr_with_noise).inspect} => #{result_label(net.eval(cr_with_noise))}"
|
60
|
+
puts "Examples with base noise"
|
61
|
+
puts "#{net.eval(tr_with_base_noise).inspect} => #{result_label(net.eval(tr_with_base_noise))}"
|
62
|
+
puts "#{net.eval(sq_with_base_noise).inspect} => #{result_label(net.eval(sq_with_base_noise))}"
|
63
|
+
puts "#{net.eval(cr_with_base_noise).inspect} => #{result_label(net.eval(cr_with_base_noise))}"
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
puts "Elapsed time: #{times}"
|
@@ -0,0 +1,68 @@
|
|
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
|
+
|
11
|
+
TRIANGLE_WITH_BASE_NOISE = [
|
12
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
13
|
+
[ 3, 3, 3, 3, 3, 3, 4, 10, 10, 4, 3, 3, 3, 3, 3, 3],
|
14
|
+
[ 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3],
|
15
|
+
[ 3, 3, 3, 3, 3, 4, 10, 4, 4, 10, 4, 3, 3, 3, 3, 3],
|
16
|
+
[ 3, 3, 3, 3, 3, 8, 8, 3, 3, 8, 8, 3, 3, 3, 3, 3],
|
17
|
+
[ 3, 3, 3, 3, 4, 10, 4, 3, 3, 4, 10, 4, 3, 3, 3, 3],
|
18
|
+
[ 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3],
|
19
|
+
[ 3, 3, 3, 4, 10, 4, 3, 3, 3, 3, 4, 10, 4, 3, 3, 3],
|
20
|
+
[ 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3],
|
21
|
+
[ 3, 3, 4, 10, 4, 3, 3, 3, 3, 3, 3, 4, 10, 4, 3, 3],
|
22
|
+
[ 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3],
|
23
|
+
[ 3, 4, 10, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 10, 4, 3],
|
24
|
+
[ 3, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3],
|
25
|
+
[ 4, 10, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 10, 4],
|
26
|
+
[ 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8],
|
27
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
28
|
+
]
|
29
|
+
|
30
|
+
SQUARE_WITH_BASE_NOISE = [
|
31
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
|
32
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
33
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
34
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
35
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
36
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
37
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
38
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
39
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
40
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
41
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
42
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
43
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
44
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
45
|
+
[10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10],
|
46
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
47
|
+
|
48
|
+
]
|
49
|
+
|
50
|
+
CROSS_WITH_BASE_NOISE = [
|
51
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
52
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
53
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
54
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
55
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
56
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
57
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
58
|
+
[ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
|
59
|
+
[ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
|
60
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
61
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
62
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
63
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
64
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
65
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3],
|
66
|
+
[ 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3]
|
67
|
+
]
|
68
|
+
|