distrb 0.1.0 → 0.1.1

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