arroz 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module Arroz
2
+ require 'arroz/knn'
3
+ require 'arroz/ensemble'
4
+ require 'arroz/distances/euclidean'
5
+ end
@@ -0,0 +1,12 @@
1
+ module Arroz::Distances
2
+ module Euclidean
3
+ extend self
4
+
5
+ def distance(e1, e2)
6
+ sum = e1.zip(e2).map { |pair| (pair.first.to_f - pair.last.to_f)**2 }.
7
+ reduce(:+)
8
+
9
+ Math.sqrt(sum)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ module Arroz
2
+
3
+ class Ensemble
4
+
5
+ attr_accessor :classifiers
6
+
7
+ def initialize(classifiers)
8
+ @classifiers = classifiers
9
+ end
10
+
11
+ def classify(element)
12
+ guesses = classifiers.map { |c| c.classify(element) }
13
+
14
+ plurality_vote(guesses)
15
+ end
16
+
17
+ def classify_projections(projections)
18
+ raise ArgumentError.new("Wrong number of projections") if projections.size != classifiers.size
19
+
20
+ guesses = classifiers.zip(projections).
21
+ map { |classifier, projection| classifier.classify(projection) }
22
+
23
+ plurality_vote(guesses)
24
+ end
25
+
26
+ private
27
+
28
+ def plurality_vote(guesses)
29
+ uniq_guesses = guesses.uniq
30
+
31
+ uniq_guesses.map { |g| guesses.count(g) }.zip(uniq_guesses).
32
+ sort.last.last
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ module Arroz
2
+ class KNN
3
+
4
+ attr_reader :data, :k
5
+
6
+ # The label attribute in the data array must be in the first position
7
+ def initialize(data, k=1)
8
+ @data = data
9
+ @k = k
10
+ end
11
+
12
+ ## Returns the predicted class of the element passed
13
+ def classify(element)
14
+ neighbors = nearest_neighbors(element)
15
+
16
+ neighbor_classes = neighbors.map(&:last)
17
+ classes = neighbor_classes.uniq
18
+
19
+ classes.zip(classes.map { |c| neighbor_classes.count(c) }).
20
+ sort_by(&:last).last.first
21
+ end
22
+
23
+ private
24
+
25
+ def nearest_neighbors(element)
26
+ distances = []
27
+
28
+ @data.each do |datum|
29
+ distances << [distance(element, datum[1..-1]), datum.first]
30
+ end
31
+
32
+ distances.sort.take(k)
33
+ end
34
+
35
+ def distance(e1, e2)
36
+ raise NotImplementedError
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Arroz
2
+ VERSION = '0.0.4'
3
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arroz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Guilherme Carvalho
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Simple attempt to build an IA framework in Ruby
31
+ email:
32
+ - guilherme@guava.com.br
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/arroz/distances/euclidean.rb
38
+ - lib/arroz/ensemble.rb
39
+ - lib/arroz/knn.rb
40
+ - lib/arroz/version.rb
41
+ - lib/arroz.rb
42
+ homepage: http://github.com/gvc/arroz
43
+ licenses: []
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: 1.3.6
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.24
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Simple attempt to build an IA framework in Ruby
66
+ test_files: []