def __init__(self, transition_rate_matrix): self._rateMatrix = transition_rate_matrix self._expDists = [] self._empiricalDists = [] for i, row in enumerate(transition_rate_matrix): # find sum of rates out of this state rate_out = out_rate(row, i) # if the rate is 0, put None as the exponential and empirical distributions if rate_out > 0: # create an exponential distribution with rate equal to sum of rates out of this state self._expDists.append(RVG.Exponential(scale=1 / rate_out)) # find the transition rates to other states # assume that the rate into this state is 0 rates = [] for j, v in enumerate(row): if i == j: rates.append(0) else: rates.append(v) # calculate the probability of each event (prob_j = rate_j / (sum over j of rate_j) probs = np.array(rates) / rate_out # create an empirical distribution over the future states from this state self._empiricalDists.append(RVG.Empirical(probs)) else: # if the sum of rates out of this state is 0 self._expDists.append(None) self._empiricalDists.append(None)
def test_exponential(rnd, scale, loc=0): # exponential random variate generator exp_dist = RVGs.Exponential(scale, loc) # obtain samples samples = get_samples(exp_dist, rnd) # report mean and variance print_test_results('Exponential', samples, expectation=scale + loc, variance=scale**2)
import SimPy.FittingProbDist_ML as Fit import numpy as np import SimPy.RandomVariantGenerators as RVGs from tests.ProbDistributions.RVGtests import get_samples import scipy.stats as scs # simulate some data np.random.seed(1) # 1 fitting a exponential distribution dist = RVGs.Exponential(5, 1) dat_exp = np.array(get_samples(dist, np.random)) # generate data dictResults = Fit.fit_exp(dat_exp, 'Data', fixed_location=1) # fit print("Fitting Exponential:", dictResults) # 2 fitting a beta distribution dist = RVGs.Beta(2, 3, loc=1, scale=2) dat_beta = np.array(get_samples(dist, np.random)) # generate data dictResults = Fit.fit_beta(dat_beta, 'Data', minimum=1, maximum=3) # fit print("Fitting Beta:", dictResults) # 3 fitting a beta-binomial distribution dist = RVGs.BetaBinomial(100, 2, 3, loc=1, scale=2) # n, a, b dat_betabin = np.array(get_samples(dist, np.random)) dictResults = Fit.fit_beta_binomial(dat_betabin, 'Data', fixed_location=1, fixed_scale=2) # fit print("Fitting BetaBinomial:", dictResults) # 4 Binomial