machine_learner 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1824a541ef0b505bf7bc812fc9a7661e9e5b64c
4
- data.tar.gz: bcdfa290c18f7e108c458f997beebd976a29ea05
3
+ metadata.gz: bf87164a6191ea911d85afaa076ad0469fd906eb
4
+ data.tar.gz: 36ae6f7878759fd3454664dc198869bb48c52c92
5
5
  SHA512:
6
- metadata.gz: 8c9752df583302b767fa3b06413d81ab3707fc99bdccc2e0106c19ccd7bdd17ca418a545d57c850afbce90a5c1be0b3f50a37a5f17250b7ff84130e063e3ef5f
7
- data.tar.gz: e1e651f7eb1596c2beafdffeb07c5d508565160fa4eca3c5054eb2ec7235fef27f85b574ce4de4f96000c40a91ab8907a0e696453576c46ba13f0cb889cc4395
6
+ metadata.gz: e3febd94592309785e96681d892321ada9889731efe76c9bfad206679a9a1ef2756b2ecf8006849cd3f9279a18a04bb11d44652bcb90f8db5787ef16052b854b
7
+ data.tar.gz: 65acb7e1618cade8704b918a777c5d79d957cb03328dd70c62ee5007e61e9a0b94cf4884370fe6826be1f0b31750b18ac2b5d9e4c764efe430ff171eb8441ad8
data/Rakefile CHANGED
@@ -1,7 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
2
 
6
3
  task :default => :spec
7
4
 
@@ -95,17 +95,21 @@ module MachineLearner
95
95
  end
96
96
  end
97
97
 
98
+ # 識別結果の生の値を返す
99
+ # @param x 特徴空間
100
+ # @return [Float] 識別結果の生の値(-1..1)
101
+ def classify_raw(x)
102
+ [@learners, @alphas].transpose.reduce(0) { |score, (l, a)| score += l.classify(x) * a }
103
+ end
104
+
98
105
  # 識別を行う
99
106
  # @param x 特徴空間
100
107
  # @return [Fixnum] 識別結果
101
108
  def classify(x)
102
- score = [@learners, @alphas].transpose.reduce(0) { |score, (l, a)|
103
- score += l.classify(x) * a
104
- }
105
- score > 0 ? 1 : -1
109
+ classify_raw(x) > 0 ? 1 : -1
106
110
  end
107
111
 
108
- # Learnerを表すログ
112
+ # Learnerを表す文字列
109
113
  def to_s
110
114
  [@learners, @alphas].transpose.map {|l, a| "(#{a.round(3)} * #{l})" }.join(" + ");
111
115
  end
@@ -8,13 +8,17 @@ module MachineLearner
8
8
  # ナイブベイズ学習器
9
9
  class BayesLearner < Learner
10
10
 
11
+ # コンストラクタ
12
+ def initialize
13
+ end
14
+
11
15
  # データを元に学習を行う
12
16
  # @param datas [Array<DataSet>] トレーニングデータの配列
13
17
  # @return [Array<Boolean>] 識別結果の配列
14
18
  def learn(datas, ds = nil)
15
19
  @training = datas
16
20
  @ys = @training.map{|data| data.y }
17
- @candidate_y = @ys.uniq.compact
21
+ @candidate_x = []
18
22
  end
19
23
 
20
24
  # 識別を行う
@@ -22,24 +26,24 @@ module MachineLearner
22
26
  # @return [Fixnum] 識別結果
23
27
  def classify(xs)
24
28
  # 最も尤度の高い候補 y を探す
25
- max_y, max_likelihood = 0, -Float::INFINITY
26
- @candidate_y.each do |y|
27
- likelihood = p_y_x(y, xs)
28
- max_y, max_likelihood = y, likelihood if max_likelihood < likelihood
29
- end
30
- return max_y
29
+ classify_raw(xs).max{ |x, y| x[1] <=> y[1] }[0]
30
+ end
31
+
32
+ def classify_raw(xs)
33
+ candidate_y.map{|y| [y, p_y_x(y, xs)]}.to_h
31
34
  end
32
35
 
33
36
  private
34
37
 
35
38
  # P(Y | X) を計算
36
39
  def p_y_x(y, xs)
40
+ # P(Y | X) = P(Y) * product(P(Xi | Y))
37
41
  p = Math.log(p_y(y))
38
42
  xs.each_with_index do |xi, i|
39
43
  next if xi.nil?
40
44
  p += Math.log(p_xi_y(xi, i, y))
41
45
  end
42
- return p
46
+ return Math.exp(p)
43
47
  end
44
48
 
45
49
  # P(Xi | Y) を計算
@@ -56,14 +60,18 @@ module MachineLearner
56
60
  # P(Y) を計算
57
61
  def p_y(y)
58
62
  count = @ys.count(y)
59
- return (count + 1).to_f / (@ys.size + @candidate_y.size + 1).to_f
63
+ return (count + 1).to_f / (@ys.size + candidate_y.size + 1).to_f
60
64
  end
61
65
 
62
66
  # xの候補を列挙
63
67
  def candidate_x(field)
64
- @candidate_x ||= []
65
68
  @candidate_x[field] ||= @training.map{|data| data.x[field]}.uniq.compact
66
69
  end
70
+
71
+ # yの候補を列挙
72
+ def candidate_y
73
+ @candidate_y ||= @ys.uniq.compact
74
+ end
67
75
  end
68
76
 
69
77
  end
@@ -5,12 +5,14 @@ module MachineLearner
5
5
  # 特徴空間xと識別結果yを持つ
6
6
  class DataSet
7
7
  attr_reader :x, :y
8
+ attr_accessor :id
8
9
 
9
10
  # コンストラクタ
10
11
  # @param x 特徴空間
11
12
  # @param y 識別結果
12
- def initialize(x, y)
13
+ def initialize(x, y, id = nil)
13
14
  @x, @y = x, y
15
+ @id = id
14
16
  end
15
17
 
16
18
  # @return データセットを表現する文字列
@@ -22,3 +24,4 @@ module MachineLearner
22
24
  end
23
25
 
24
26
  # vim: set et ts=2 sts=2 sw=2:
27
+
@@ -1,3 +1,3 @@
1
1
  module MachineLearner
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.6"
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency 'rspec', '~> 0'
25
24
  end
26
25
 
27
26
  # vim: set et ts=2 sts=2 sw=2:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: machine_learner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - YutaTanaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-11 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  description: |
56
42
  This is a library for machine learning.
57
43
  You can use AdaBoost and Naive Bayes easily.
@@ -104,4 +90,3 @@ summary: Library for machine learning.
104
90
  test_files:
105
91
  - spec/machine_learner_spec.rb
106
92
  - spec/spec_helper.rb
107
- has_rdoc: