diverge 1.5.2 → 1.6.0

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.
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.