diverge 1.5.2 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|