ai4ruby 1.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|