kder 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ require_relative 'kder/kde'
2
+ class Kder
3
+ Major,Minor,Patch = File.readlines("VERSION").map(&:chomp)
4
+ VERSION = [Major,Minor,Patch].join(".")
5
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../util/enum_extensions'
2
+ module Bandwidth
3
+ class << self
4
+ def silverman(input_arr, std_deviation = input_arr.standard_deviation)
5
+ bandwidth = ((4 * std_deviation ** 5)/(3 * input_arr.size))**(1.0/5)
6
+ end
7
+ alias_method :estimate, :silverman
8
+ alias_method :nrd0, :silverman
9
+
10
+ #def mean_integrated_squared_error(a,b,c,d)
11
+ #end
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ class Kder
2
+ require 'distribution'
3
+ require_relative 'bandwidth'
4
+ require_relative '../util/statistics'
5
+
6
+ Sigmas = 2.5
7
+ MeshCount = 2e3
8
+ MinimumThresholdValue = 1e-2
9
+ class << self
10
+ ##
11
+ # :singleton-method: kde
12
+ # Accepts a single member array plus optional additional information
13
+ # Returns a two member array, [x_vals,y_vals] representing the kde
14
+ def kde(arr, bw = nil, opts = {sigmas: Sigmas, sampling_density: MeshCount, threshold: MinimumThresholdValue})
15
+ unless bw # is nil
16
+ bw = Bandwidth.silverman(arr)
17
+ end
18
+ # Initialization steps
19
+ min = arr.min - bw*opts[:sigmas]
20
+ max = arr.max + bw*opts[:sigmas]
21
+ step_size = (max-min)/opts[:sampling_density].to_f
22
+ arr.sort!
23
+ # Step through the range
24
+ output = (min..max).step(step_size).map do |mid|
25
+ high_end = mid+ bw*opts[:sigmas]
26
+ lower_end = mid - bw*opts[:sigmas]
27
+ included = arr.select {|a| (lower_end..high_end).include?(a)}
28
+ intensity = included.map {|a| Kder::Statistics.custom_pdf(a-mid, bw) }.inject(:+)
29
+ intensity ||= 0
30
+ [mid, intensity ] unless intensity < opts[:threshold]
31
+ end
32
+ output.compact.transpose
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ module Enumerable
2
+ # Thanks StackOverflow users!
3
+ # http://stackoverflow.com/questions/7749568/how-can-i-do-standard-deviation-in-ruby
4
+ def sum
5
+ self.inject(:+)
6
+ end
7
+ def mean
8
+ self.sum/self.length.to_f
9
+ end
10
+ alias average mean
11
+ def sample_variance
12
+ m = self.mean
13
+ sum = self.inject(0){|accum, i| accum + (i-m)**2}
14
+ sum/(self.length - 1).to_f
15
+ end
16
+ def standard_deviation
17
+ Math.sqrt(self.sample_variance)
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ class Kder
2
+ module Statistics
3
+ SQ2PI = Math.sqrt(2 * Math::PI)
4
+ # Normal pdf with a custom sigma value, still centered around 0.
5
+ def self.custom_pdf(x, sigma = 1.0)
6
+ mean = 0
7
+ (1.0/( sigma*SQ2PI))*Math::exp(-0.5*((x-mean)/sigma)**2)
8
+ end
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Taylor
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-24 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A KDE implementation in Ruby.
15
+ email:
16
+ - ryanmt@byu.net
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/kder.rb
22
+ - lib/kder/bandwidth.rb
23
+ - lib/kder/kde.rb
24
+ - lib/util/enum_extensions.rb
25
+ - lib/util/statistics.rb
26
+ homepage: https://github.com/princelab/KDER
27
+ licenses: []
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 1.8.24
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: Kernel Density Estimation, and an associated bandwidth estimator, rudimentary
50
+ at best, but a decent first approximation for backend preparing of KDE plots for
51
+ plotting in JS libraries, or for whatever you would like to use it.
52
+ test_files: []