distrb 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fc51539b420f62a9cb220ffe30a1768d85df61617f0c7141a6b010ded9c6c31
4
- data.tar.gz: 264e6e8821b8f2a7b80a8fa3cba8afb7ab2515a2469960737d5a42204db2cc75
3
+ metadata.gz: 6c15770c7b7ceb63dedf17ec875bfebf79803989e159980c4e27e444865e8595
4
+ data.tar.gz: 62e7e2ce0fe666453763ea0fe77bc543cf9365032dc54757ec0670c70d33f3b2
5
5
  SHA512:
6
- metadata.gz: 338943757e3fcefebabea97afc6d21e4ede31f2e9ff249f6798d9131e23d42ab0d2a0415be3053149f30b63f95577339c5f951fff68d911f180cf47aadc0541e
7
- data.tar.gz: ac0709706f97d1cda745cba9e17bbcc98e19a0689fcedfaa7b71b6a0f6dda46873303622b0511d29b8513914cf1bf68d7d8acb9829e1f6c2bb662882dd8b6101
6
+ metadata.gz: 6ec3b4b212979a1ffd612d378835a605174dc4e7b79ee410d2b66543f0aece225d0175286041c3809c28b781276c02f3a0451ec9ef603e1f11f72ca817d68337
7
+ data.tar.gz: 5af07c57c48f303a776c2fc2343ccaab277264f03f39ec4536650c1ae7eb52fac9d49ac53e93280d3e9cf869e87aa0050cec6d469385c23c67c44d798dce8f55
@@ -18,3 +18,9 @@ Style/Documentation:
18
18
  Exclude:
19
19
  - 'spec/**/*'
20
20
  - 'test/**/*'
21
+
22
+ # Configuration parameters: CountComments, ExcludedMethods.
23
+ Metrics/BlockLength:
24
+ Exclude:
25
+ - 'spec/**/*'
26
+ - 'test/**/*'
@@ -3,13 +3,14 @@
3
3
 
4
4
  require 'bundler/setup'
5
5
  require 'distrb'
6
+ require 'distrb/multivariate'
6
7
 
7
8
  # You can add fixtures and/or initialization code here to make experimenting
8
9
  # with your gem easier. You can also use a different console, if you like.
9
10
 
10
11
  # (If you use this, don't forget to add pry to your Gemfile!)
11
- # require "pry"
12
- # Pry.start
12
+ require 'pry'
13
+ Pry.start
13
14
 
14
- require 'irb'
15
- IRB.start(__FILE__)
15
+ # require 'irb'
16
+ # IRB.start(__FILE__)
@@ -22,9 +22,11 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ['lib']
23
23
 
24
24
  spec.add_development_dependency 'bundler', '~> 1.16'
25
+ spec.add_development_dependency 'gsl', '~> 2.1.0'
25
26
  spec.add_development_dependency 'guard', '~> 2.14.0'
26
27
  spec.add_development_dependency 'guard-rspec', '~> 4.7.0'
27
28
  spec.add_development_dependency 'guard-rubocop', '~> 1.3.0'
29
+ spec.add_development_dependency 'pry', '~> 0.11.3'
28
30
  spec.add_development_dependency 'rake', '~> 10.0'
29
31
  spec.add_development_dependency 'rspec', '~> 3.0'
30
32
  spec.add_development_dependency 'rubocop', '~> 0.52.0'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Namespace for multivariate probability distributions
5
+ #
6
+ module Distrb::Multivariate
7
+ require_relative './multivariate/distribution'
8
+ require_relative './multivariate/normal'
9
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Base class of multivariate probability distribution
5
+ # Currently, this class only supports sampling feature.
6
+ #
7
+ class Distrb::Multivariate::Distribution
8
+ def sampler
9
+ raise NotImplementedError
10
+ end
11
+
12
+ def sample
13
+ self.sampler.sample
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gsl'
4
+
5
+ #
6
+ # Normal distribution
7
+ # See: https://en.wikipedia.org/wiki/Multivariate_normal_distribution
8
+ #
9
+ class Distrb::Multivariate::Normal < Distrb::Multivariate::Distribution
10
+ require_relative './normal/transform_independent_samples'
11
+
12
+ attr_reader :sampler
13
+
14
+ def initialize mean, covariance = nil
15
+ @sampler = TransformIndependentSamples.new mean, covariance
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Generating random values from multivariate normal distribution can be done
5
+ # with independent samples from normal distribution.
6
+ # In this way, a square root of the covariance matrix is required.
7
+ # We use SVD to get the matrix.
8
+ # See: https://stats.stackexchange.com/a/159322/89764
9
+ #
10
+ class Distrb::Multivariate::Normal::TransformIndependentSamples
11
+ attr_reader :normal, :mean, :covariance
12
+
13
+ def initialize mean, covariance = nil
14
+ @normal = Distrb::Normal.new
15
+ @mean = mean
16
+ @covariance = covariance || GSL::Matrix.eye(mean.length)
17
+ end
18
+
19
+ def sample
20
+ x = GSL::Vector.alloc(Array.new(self.mean.length) { self.normal.sample })
21
+ (sqrt_covariance * x + self.mean).to_a
22
+ end
23
+
24
+ private
25
+
26
+ def sqrt_covariance
27
+ @sqrt_covariance ||=
28
+ begin
29
+ u, _v, s = svd_covariance
30
+ u * s.sqrt.to_m_diagonal
31
+ end
32
+ end
33
+
34
+ def svd_covariance
35
+ @svd_covariance ||= @covariance.svd
36
+ end
37
+ end
@@ -7,9 +7,15 @@
7
7
  class Distrb::Normal < Distrb::Distribution
8
8
  require_relative './normal/box_muller_transform'
9
9
 
10
- attr_reader :sampler
10
+ attr_reader :sampler, :mean, :stdev
11
11
 
12
- def initialize
12
+ def initialize mean = 0.0, stdev = 1.0
13
13
  @sampler = BoxMullerTransform.new
14
+ @mean = mean
15
+ @stdev = stdev
16
+ end
17
+
18
+ def sample
19
+ super * self.stdev + self.mean
14
20
  end
15
21
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Distrb
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: distrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroki Arai
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: gsl
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: guard
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
82
  version: 1.3.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.11.3
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.11.3
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rake
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +163,10 @@ files:
135
163
  - lib/distrb/gamma/marsaglia_tsang.rb
136
164
  - lib/distrb/gamma/marsaglia_tsang/high_alpha.rb
137
165
  - lib/distrb/gamma/marsaglia_tsang/low_alpha.rb
166
+ - lib/distrb/multivariate.rb
167
+ - lib/distrb/multivariate/distribution.rb
168
+ - lib/distrb/multivariate/normal.rb
169
+ - lib/distrb/multivariate/normal/transform_independent_samples.rb
138
170
  - lib/distrb/normal.rb
139
171
  - lib/distrb/normal/box_muller_transform.rb
140
172
  - lib/distrb/uniform.rb