diverge 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/diverge.rb +31 -25
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7de447db693d2e50dbb261df278e7b32606ba921
4
- data.tar.gz: 3ea2bbd20d21a8846ff954e40e02e0d3fa56209e
3
+ metadata.gz: d2cd8d94fdf70557ab93aca2fc0a69b59052c4c3
4
+ data.tar.gz: 48be5b606bac2d7ebee97c51794c91ec0c517fad
5
5
  SHA512:
6
- metadata.gz: e3197aeac30d5c43f9abec5748c873b6c9a34413a9483980cdd344fa5f1373991f2bcca199b3a925896f4f7a51adbd6bd7e2014323fb2fdada5b429a3c43022a
7
- data.tar.gz: 430487c51caee42807d101cd525f8ab14726e879b52322d11bb189296e04ad7c0c0db11af21eec19201419c0cc17e3556d21a5054341ef4d41a3238d5e45af97
6
+ metadata.gz: 09f7f2f69bdcb9ebd3b59c08ece6b9a0540d56c1bc1d6c6bf3509b6677a6d145ee1f307185ecbbb9210f7437c555757d8f43f4863a8258e25e1b8fef4987edb4
7
+ data.tar.gz: 2d47358eebf32d125ffc19f4792de1c7654329dcce95495a2c3691ea4f9d274f88e9d87e4236b7ec81f3e362f4dadc3895736958dc7158b2cb0dd7e2436c54d4
@@ -14,61 +14,61 @@ class Diverge
14
14
  end
15
15
  end
16
16
  end
17
-
17
+
18
18
  @debug = true
19
-
19
+
20
20
  attr_reader :p, :q
21
-
21
+
22
22
  def initialize(p, q)
23
23
  @p, @q = p, q
24
-
24
+
25
25
  unless p.length == q.length
26
26
  debugger { "The two discrete distributions must have the same number of elements" }
27
27
  end
28
-
28
+
29
29
  unless (p_sum = p.inject(&:+)) == 1
30
30
  debugger { "Warning: the first argument does not sum to 1, the sum is #{p_sum.inspect}" }
31
31
  end
32
-
32
+
33
33
  unless (q_sum = q.inject(&:+)) == 1
34
34
  debugger { "Warning: the second argument does not sum to 1, the sum is #{q_sum.inspect}" }
35
35
  end
36
36
  end
37
-
37
+
38
38
  def kullback_leibler(reverse = false)
39
39
  (reverse ? q.zip(p) : p.zip(q)).inject(0.0) do |sum, (i, j)|
40
40
  if i > 0 && j.zero?
41
41
  raise ArgumentError.new("Kullback-Leibler is not defined when P(i) > 0 and Q(i) = 0")
42
42
  end
43
-
43
+
44
44
  sum + (i.zero? ? 0 : i * Math.log(i / j))
45
45
  end
46
46
  end
47
-
47
+
48
48
  alias :kl :kullback_leibler
49
-
49
+
50
50
  def jensen_shannon
51
51
  m = p.zip(q).map { |p_i, q_i| 0.5 * (p_i + q_i) }
52
-
52
+
53
53
  silently do
54
54
  0.5 * (Diverge.new(p, m).kl + Diverge.new(q, m).kl)
55
55
  end
56
56
  end
57
-
57
+
58
58
  alias :js :jensen_shannon
59
-
59
+
60
60
  def j_divergence
61
61
  0.5 * (kl + kl(:reverse))
62
62
  end
63
-
63
+
64
64
  alias :j :j_divergence
65
-
65
+
66
66
  def total_variation_distance
67
67
  0.5 * p.zip(q).inject(0.0) { |sum, (i, j)| sum + (i - j).abs }
68
68
  end
69
-
69
+
70
70
  alias :tvd :total_variation_distance
71
-
71
+
72
72
  def correlation
73
73
  square = ->(x) { x ** 2 }
74
74
  top = size * p.zip(q).map { |x, y| x * y }.inject(&:+) - p.inject(&:+) * q.inject(&:+)
@@ -76,7 +76,7 @@ class Diverge
76
76
 
77
77
  bottom.zero? ? 0 : top / bottom
78
78
  end
79
-
79
+
80
80
  alias :corr :correlation
81
81
 
82
82
  def spearman_correlation
@@ -86,27 +86,33 @@ class Diverge
86
86
  end
87
87
 
88
88
  alias :s_corr :spearman_correlation
89
-
89
+
90
90
  def mean_square_error
91
91
  p.zip(q).inject(0.0) { |sum, (i, j)| sum + (i - j) ** 2 } / size
92
92
  end
93
-
93
+
94
94
  alias :mse :mean_square_error
95
-
95
+
96
+ def root_mean_square_deviation
97
+ Math.sqrt(p.zip(q).inject(0.0) { |sum, (i, j)| sum + (i - j) ** 2 } / size)
98
+ end
99
+
100
+ alias :rmsd :root_mean_square_deviation
101
+
96
102
  def debug
97
103
  self.class.debug
98
104
  end
99
-
105
+
100
106
  def debug=(value)
101
107
  self.class.debug = value
102
108
  end
103
-
109
+
104
110
  def silently(&block)
105
111
  debug_value = debug
106
112
  self.debug = false
107
113
  (yield block).tap { self.debug = debug_value }
108
114
  end
109
-
115
+
110
116
  private
111
117
 
112
118
  def list_ranks(list)
@@ -125,7 +131,7 @@ class Diverge
125
131
  def size
126
132
  p.length == q.length ? p.length : [p.length, q.length]
127
133
  end
128
-
134
+
129
135
  def debugger
130
136
  STDERR.puts yield if debug
131
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diverge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Senter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
11
+ date: 2014-07-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple collection of functions for determining the divergence between
14
14
  two distributions.
@@ -17,9 +17,9 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - lib/diverge.rb
21
20
  - LICENSE
22
21
  - README.md
22
+ - lib/diverge.rb
23
23
  homepage: http://rubygems.org/gems/diverge
24
24
  licenses: []
25
25
  metadata: {}
@@ -39,7 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  version: '0'
40
40
  requirements: []
41
41
  rubyforge_project:
42
- rubygems_version: 2.1.4
42
+ rubygems_version: 2.4.1
43
43
  signing_key:
44
44
  specification_version: 4
45
45
  summary: Distribution divergences.