diverge 1.0.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 (2) hide show
  1. data/lib/diverge.rb +38 -0
  2. metadata +47 -0
data/lib/diverge.rb ADDED
@@ -0,0 +1,38 @@
1
+ class Diverge
2
+ attr_reader :p, :q
3
+
4
+ def initialize(p, q)
5
+ @p, @q = p, q
6
+
7
+ unless p.length == q.length
8
+ raise ArgumentError.new("The two discrete distributions must have the same number of elements")
9
+ end
10
+
11
+ unless (p_sum = p.inject(&:+)) == 1
12
+ STDERR.puts("Warning: the first argument does not sum to 1, the sum is #{p_sum}")
13
+ end
14
+
15
+ unless (q_sum = q.inject(&:+)) == 1
16
+ STDERR.puts("Warning: the second argument does not sum to 1, the sum is #{q_sum}")
17
+ end
18
+ end
19
+
20
+ def kullback_leibler(reverse = false)
21
+ (reverse ? q.zip(p) : p.zip(q)).inject(0.0) { |sum, (i, j)| sum + (i.zero? ? 0 : i * Math.log(safe_cast(i) / safe_cast(j))) }
22
+ end
23
+
24
+ alias :kl :kullback_leibler
25
+
26
+ def jensen_shannon
27
+ 0.5 * (kl + kl(:reverse))
28
+ end
29
+
30
+ alias :js :jensen_shannon
31
+
32
+ private
33
+
34
+ def safe_cast(value)
35
+ # Just to make sure we don't go crazy and to_f a Complex, for whatever insane reason that might come up, while still avoiding integer division
36
+ value.class < Integer ? value.to_f : value
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: diverge
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Evan Senter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-19 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A simple collection of functions for determining the divergence between
15
+ two distributions.
16
+ email: evansenter@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ./lib/diverge.rb
22
+ homepage: http://rubygems.org/gems/diverge
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 1.8.24
43
+ signing_key:
44
+ specification_version: 3
45
+ summary: Distribution divergences.
46
+ test_files: []
47
+ has_rdoc: