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.
- checksums.yaml +4 -4
- data/lib/diverge.rb +31 -25
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2cd8d94fdf70557ab93aca2fc0a69b59052c4c3
|
4
|
+
data.tar.gz: 48be5b606bac2d7ebee97c51794c91ec0c517fad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 09f7f2f69bdcb9ebd3b59c08ece6b9a0540d56c1bc1d6c6bf3509b6677a6d145ee1f307185ecbbb9210f7437c555757d8f43f4863a8258e25e1b8fef4987edb4
|
7
|
+
data.tar.gz: 2d47358eebf32d125ffc19f4792de1c7654329dcce95495a2c3691ea4f9d274f88e9d87e4236b7ec81f3e362f4dadc3895736958dc7158b2cb0dd7e2436c54d4
|
data/lib/diverge.rb
CHANGED
@@ -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.
|
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:
|
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
|
42
|
+
rubygems_version: 2.4.1
|
43
43
|
signing_key:
|
44
44
|
specification_version: 4
|
45
45
|
summary: Distribution divergences.
|