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 +4 -4
- data/.rubocop.yml +6 -0
- data/bin/console +5 -4
- data/distrb.gemspec +2 -0
- data/lib/distrb/multivariate.rb +9 -0
- data/lib/distrb/multivariate/distribution.rb +15 -0
- data/lib/distrb/multivariate/normal.rb +17 -0
- data/lib/distrb/multivariate/normal/transform_independent_samples.rb +37 -0
- data/lib/distrb/normal.rb +8 -2
- data/lib/distrb/version.rb +1 -1
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c15770c7b7ceb63dedf17ec875bfebf79803989e159980c4e27e444865e8595
|
4
|
+
data.tar.gz: 62e7e2ce0fe666453763ea0fe77bc543cf9365032dc54757ec0670c70d33f3b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ec3b4b212979a1ffd612d378835a605174dc4e7b79ee410d2b66543f0aece225d0175286041c3809c28b781276c02f3a0451ec9ef603e1f11f72ca817d68337
|
7
|
+
data.tar.gz: 5af07c57c48f303a776c2fc2343ccaab277264f03f39ec4536650c1ae7eb52fac9d49ac53e93280d3e9cf869e87aa0050cec6d469385c23c67c44d798dce8f55
|
data/.rubocop.yml
CHANGED
data/bin/console
CHANGED
@@ -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
|
-
|
12
|
-
|
12
|
+
require 'pry'
|
13
|
+
Pry.start
|
13
14
|
|
14
|
-
require 'irb'
|
15
|
-
IRB.start(__FILE__)
|
15
|
+
# require 'irb'
|
16
|
+
# IRB.start(__FILE__)
|
data/distrb.gemspec
CHANGED
@@ -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,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
|
data/lib/distrb/normal.rb
CHANGED
@@ -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
|
data/lib/distrb/version.rb
CHANGED
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.
|
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-
|
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
|