72 lines
1.6 KiB
Python
Executable File
72 lines
1.6 KiB
Python
Executable File
import numpy as np
|
|
from prml.rv.rv import RandomVariable
|
|
|
|
|
|
class Uniform(RandomVariable):
|
|
"""
|
|
Uniform distribution
|
|
p(x|a, b)
|
|
= 1 / ((b_0 - a_0) * (b_1 - a_1)) if a <= x <= b else 0
|
|
"""
|
|
|
|
def __init__(self, low, high):
|
|
"""
|
|
construct uniform distribution
|
|
|
|
Parameters
|
|
----------
|
|
low : int, float, or np.ndarray
|
|
lower boundary
|
|
high : int, float, or np.ndarray
|
|
higher boundary
|
|
"""
|
|
super().__init__()
|
|
low = np.asarray(low)
|
|
high = np.asarray(high)
|
|
assert low.shape == high.shape
|
|
assert (low <= high).all()
|
|
self.low = low
|
|
self.high = high
|
|
self.value = 1 / np.prod(high - low)
|
|
|
|
@property
|
|
def low(self):
|
|
return self.parameter["low"]
|
|
|
|
@low.setter
|
|
def low(self, low):
|
|
self.parameter["low"] = low
|
|
|
|
@property
|
|
def high(self):
|
|
return self.parameter["high"]
|
|
|
|
@high.setter
|
|
def high(self, high):
|
|
self.parameter["high"] = high
|
|
|
|
@property
|
|
def ndim(self):
|
|
return self.low.ndim
|
|
|
|
@property
|
|
def size(self):
|
|
return self.low.size
|
|
|
|
@property
|
|
def shape(self):
|
|
return self.low.shape
|
|
|
|
@property
|
|
def mean(self):
|
|
return 0.5 * (self.low + self.high)
|
|
|
|
def _pdf(self, X):
|
|
higher = np.logical_and.reduce(X >= self.low, 1)
|
|
lower = np.logical_and.reduce(X <= self.high, 1)
|
|
return self.value * np.logical_and(higher, lower)
|
|
|
|
def _draw(self, sample_size=1):
|
|
u01 = np.random.uniform(size=(sample_size,) + self.shape)
|
|
return u01 * (self.high - self.low) + self.low
|