random_value_sampler 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +100 -0
- data/Rakefile +7 -0
- data/lib/random_value_sampler/version.rb +3 -0
- data/lib/random_value_sampler.rb +4 -3
- data/random_value_sampler.gemspec +18 -0
- data/test/.svn/entries +62 -0
- data/test/.svn/text-base/random_value_sampler_test.rb.svn-base +890 -0
- data/test/random_value_sampler_test.rb +2 -5
- metadata +52 -38
- data/README +0 -79
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Brian Percival
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# RandomValueSampler
|
2
|
+
|
3
|
+
Class to allow sampling from very, very simple probability mass functions
|
4
|
+
(uniform and arbitrary non-uniform). Values can be any object;
|
5
|
+
for uniform distributions, a Range can be used to specify a range of
|
6
|
+
discrete values.
|
7
|
+
|
8
|
+
To specify a uniform distribution, only the values need to be specified, and
|
9
|
+
can be:
|
10
|
+
- an Array of values (it is assumed the values are distinct, but you may
|
11
|
+
insert duplicates if you know what you're doing and realize you're probably
|
12
|
+
no longer dealing with a truly uniform distribution anymore (but this could
|
13
|
+
be used to "cheat" to generate distributions that are 'nearly' uniform where
|
14
|
+
probability mass is quantized (e.g. a 1/3, 2/3 distribution). This may
|
15
|
+
prove to be a more efficient implementation in such cases as the non-uniform
|
16
|
+
pmf is more computationally demanding).
|
17
|
+
- a ruby Range object; RandomValueSampler honors the inclusion/exclusion of last/end
|
18
|
+
of the Range (as defined by exclude_end? method). the Range must be of
|
19
|
+
numeric type unless you REALLY know what you're doing (e.g. the Xs class
|
20
|
+
example in the Range rdoc won't work).
|
21
|
+
- a single numeric type specifying an upper bound (zero is assumed as
|
22
|
+
lower bound--both zero and upper bound are included in distribution)
|
23
|
+
|
24
|
+
To specify a non-uniform distribution, the values and probability mass
|
25
|
+
must be specified. It is not necessary for the probability mass to
|
26
|
+
represent a true probability distribution (needn't sum to 1), as the class
|
27
|
+
will normalize accordingly. The pmf may be specified as a Hash or an Array:
|
28
|
+
- Hash, where the hash keys are the possible values the random variable
|
29
|
+
can take on; the hash values are the 'frequency counts' or non-normalized
|
30
|
+
probability mass
|
31
|
+
- Array, each element of which is a two-element array. each two element
|
32
|
+
array's first element is the value; the last element is the frequency
|
33
|
+
count for that value
|
34
|
+
|
35
|
+
## Installation
|
36
|
+
|
37
|
+
Add this line to your application's Gemfile:
|
38
|
+
|
39
|
+
gem 'random_value_sampler'
|
40
|
+
|
41
|
+
And then execute:
|
42
|
+
|
43
|
+
$ bundle
|
44
|
+
|
45
|
+
Or install it yourself as:
|
46
|
+
|
47
|
+
$ gem install random_value_sampler
|
48
|
+
|
49
|
+
## Usage
|
50
|
+
|
51
|
+
require 'random_value_sampler'
|
52
|
+
|
53
|
+
uniform
|
54
|
+
|
55
|
+
# generate a uniform pmf over [1,5]
|
56
|
+
a = RandomValueSampler.new_uniform([1,2,3,4,5])
|
57
|
+
|
58
|
+
# generate a uniform pmf over some words
|
59
|
+
a = RandomValueSampler.new_uniform(["one", "two", "buckle", "my", "shoe"])
|
60
|
+
|
61
|
+
# generate a 'quantized' pmf by using duplicate entries
|
62
|
+
a = RandomValueSampler.new_uniform([1, 2, 2, 3, 3, 3])
|
63
|
+
a = RandomValueSampler.new_uniform(["the", "the", "a", "the", "and", "zyzzyva"])
|
64
|
+
|
65
|
+
# generate a uniform pmf over [1,5] using a Range
|
66
|
+
a = RandomValueSampler.new_uniform(1..5)
|
67
|
+
a = RandomValueSampler.new_uniform(1...6)
|
68
|
+
|
69
|
+
# generate a uniform pmf over [0,5] by specifying upper limit
|
70
|
+
a = RandomValueSampler.new_uniform(5)
|
71
|
+
|
72
|
+
non-uniform
|
73
|
+
|
74
|
+
# generate a non-uniform pmf using the Hash form:
|
75
|
+
|
76
|
+
# values are 5 and 10, with probability 0.4 and 0.6, respectively
|
77
|
+
a = RandomValueSampler.new_non_uniform( { 5 => 20, 10 => 30 } )
|
78
|
+
|
79
|
+
# values are "probable", "possible" and "not likely" with probability
|
80
|
+
# 0.75, 0.20 and 0.05, respectively.
|
81
|
+
a = RandomValueSampler.new_non_uniform( { "probable" => 75,
|
82
|
+
"possible" => 20,
|
83
|
+
"not likely" => 5 } )
|
84
|
+
|
85
|
+
# generate a non-uniform pmf using the Array form (same examples as above)
|
86
|
+
a = RandomValueSampler.new_non_uniform( [ [5,20], [10,30] )
|
87
|
+
a = RandomValueSampler.new_non_uniform( [ ["probable",75],
|
88
|
+
["possible" => 20],
|
89
|
+
["not likely" => 5 ] ] )
|
90
|
+
|
91
|
+
## Contributing
|
92
|
+
|
93
|
+
1. Fork it
|
94
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
95
|
+
3. Write new tests and test:
|
96
|
+
bundle exec rake test
|
97
|
+
(NOTE: if you add new test files, please clean up the test rake test...it's a hack right now)
|
98
|
+
4. Commit your changes (`git commit -am 'Added some feature'`)
|
99
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
100
|
+
6. Create new Pull Request
|
data/Rakefile
ADDED
data/lib/random_value_sampler.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'random_value_sampler/version')
|
2
|
+
|
1
3
|
# simple class for generating and sampling from a probability distribution,
|
2
4
|
# including implementation of sampling from uniform and arbitrary distributions
|
3
5
|
# on discrete random variables, by passing in an object that represents
|
@@ -40,7 +42,6 @@
|
|
40
42
|
# the sample_unique() method will likely run faster.
|
41
43
|
#-------------------------------------------------------------------------------
|
42
44
|
class RandomValueSampler
|
43
|
-
|
44
45
|
# instantiate RandomValueSampler given a probability_function object. the
|
45
46
|
# object must respond to:
|
46
47
|
# - sample_from_distribution -> single value sampled from distribution
|
@@ -235,8 +236,8 @@ class RandomValueSampler
|
|
235
236
|
end
|
236
237
|
|
237
238
|
@num_values = vals.length
|
238
|
-
@values = vals
|
239
|
-
else
|
239
|
+
@values = vals.clone
|
240
|
+
else # (Range)
|
240
241
|
@num_values = vals.last - vals.first + (vals.exclude_end? ? 0 : 1)
|
241
242
|
@values = vals
|
242
243
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'lib/random_value_sampler/version')
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Brian Percival"]
|
6
|
+
gem.email = ["bpercival@goodreads.com"]
|
7
|
+
gem.description = %q{Class for sampling from arbitrary probability distributions}
|
8
|
+
gem.summary = %q{Class for sampling from arbitrary probability distributions, particular discrete random variables with lookup-table-like PMFs}
|
9
|
+
gem.homepage = "https://github.com/bmpercy/random_value_sampler"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "random_value_sampler"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = RandomValueSampler::VERSION
|
17
|
+
gem.add_development_dependency 'rake'
|
18
|
+
end
|
data/test/.svn/entries
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
10
|
2
|
+
|
3
|
+
dir
|
4
|
+
16712
|
5
|
+
svn+ssh://bpercival@svn/home/svn/repository/discovereads_archive/code/gems/random_value_sampler/test
|
6
|
+
svn+ssh://bpercival@svn/home/svn/repository
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
2011-03-18T22:57:57.847457Z
|
11
|
+
16598
|
12
|
+
bpercival
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
b7929305-2822-0410-b81b-d5ebcc0c7c9f
|
28
|
+
|
29
|
+
random_value_sampler_test.rb
|
30
|
+
file
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
2011-03-23T18:17:45.000000Z
|
36
|
+
57871a1c82580fe89b7e24f39c979bb4
|
37
|
+
2011-03-18T22:57:57.847457Z
|
38
|
+
16598
|
39
|
+
bpercival
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
42257
|
62
|
+
|