def main(): tau = pm.rdiscrete_uniform(0, 80) print tau alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) print lambda_1, lambda_2 data = np.r_[pm.rpoisson(lambda_1, tau), pm.rpoisson(lambda_2, 80 - tau)] def plot_artificial_sms_dataset(): tau = pm.rdiscrete_uniform(0, 80) alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) data = np.r_[pm.rpoisson(lambda_1, tau), pm.rpoisson(lambda_2, 80 - tau)] plt.bar(np.arange(80), data, color="#348ABD") plt.bar(tau - 1, data[tau - 1], color="r", label="user behaviour changed") plt.xlim(0, 80) plt.title("More example of artificial datasets") for i in range(1, 5): plt.subplot(4, 1, i) plot_artificial_sms_dataset() plt.show()
def data_gen(samples_n=10, tau_start=75, tau_end=100, gamma=0.1): alpha = 1.0 / gamma for x in xrange(samples_n): tau = pm.rdiscrete_uniform(tau_start, tau_end) # lam = pm.rexponential(alpha) lam = alpha yield pm.rpoisson(lam, tau)
def plot_artificial_sms_dataset(): tau = pm.rdiscrete_uniform(0, 80) alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) data = np.r_[pm.rpoisson(lambda_1, tau), pm.rpoisson(lambda_2, 80 - tau)] plt.bar(np.arange(80), data, color="#348ABD") plt.bar(tau - 1, data[tau - 1], color="r", label="user behaviour changed") plt.xlim(0, 80)
def plot_artificial_sms_dataset(): maxdays = 80 tau = pm.rdiscrete_uniform( 0, maxdays ) alpha = 1 / 20. lambda_1, lambda_2 = pm.rexponential( alpha, 2 ) data = np.r_[ pm.rpoisson( lambda_1, tau ), pm.rpoisson( lambda_2, maxdays-tau )] plt.bar( np.arange(maxdays), data ) plt.bar( tau - 1, data[tau-1], color = 'r', label='change point' ) plt.xlim( 0, 80 )
def plot_artificail_sms_dataset(): #---------------------------------- # initialize both deterministic and stochastic variables tau = pm.rdiscrete_uniform(0, 80) print("tau = {0}".format(tau)) alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) print("lambda_1 = {0}\nlambda_2 = {1}".format(lambda_1, lambda_2)) lambda_ = np.r_[lambda_1 * np.ones(tau), lambda_2 * np.ones(80 - tau)] print("lambda = \n{0}".format(lambda_)) data = pm.rpoisson(lambda_) print("data = \n{0}".format(data)) #----------------------------------- # plot the artificial plt.bar(np.arange(80), data, color="#348ABD") plt.bar(tau - 1, data[tau - 1], color="r", label="user behavior changed") plt.xlabel("Time(days)") plt.ylabel("Text messages received") plt.xlim(0, 80)
def plot_artifical_sms_dataset(): # specify when the user's behaviour (amount of sms received) switches by sampling from DiscreteUniform tau = rdiscrete_uniform(0, 80) print('τ = {}'.format(tau,)) alpha = 1. / 20. lambda_1, lambda_2 = rexponential(alpha, 2) print(lambda_1, lambda_2) # for days before tau, repr. the user's received sms count by sampling from a # Poisson(lambda_1), and for days after tau by sampling from Poisson(lambda_2) data = np.r_[rpoisson(lambda_1, tau), rpoisson(lambda_2, 80 - tau)] print(data) # plot artificial data set pyplot.bar(np.arange(80), data, color="#348ABD") pyplot.bar(tau - 1, data[tau - 1], color="r", label="user behaviour changed") pyplot.xlabel("time (days)") pyplot.ylabel("count of sms received") pyplot.xlim(0, 80) pyplot.legend()
def data_gen_for_rnn(samples_n=1, tau_start=75, tau_end=100, gamma=0.01, var=5): alpha = 1.0 / gamma lam = alpha for i in xrange(samples_n): con = [] tau = pm.rdiscrete_uniform(tau_start, tau_end) for j in xrange(tau): if j == 0: val = round(pm.rnormal(lam, var), 2) con.append(val) elif j == 1: val = con[0] + pm.rnormal(0, var) val = round(val, 2) con.append(val) else: # n = len(con) # lam_n = float(np.array(con).sum())/n val = 0.7 * con[-1] + 0.3 * con[-2] + pm.rnormal(0, var) val = round(val, 2) con.append(val) # print val, lam_n yield con
import numpy as np import pymc as pm from matplotlib import pyplot as plt tau = pm.rdiscrete_uniform(0, 80) print(tau) alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) print(lambda_1, lambda_2) data = np.r_[pm.rpoisson(lambda_1, tau), pm.rpoisson(lambda_2, 80 - tau)] plt.bar(np.arange(80), data, color="#348ABD") plt.bar(tau - 1, data[tau - 1], color="r", label="user behaviour changed") plt.xlabel("Time (days)") plt.ylabel("count of text-msgs received") plt.title("Artificial dataset") plt.xlim(0, 80) plt.legend(); plt.show()
fixed_variable.value # fix txt msg to observed data set data = np.array( [10, 20, 15, 20, 49] ) obs = pm.Poisson( "obs", lambda_, value=data, observed=True ) obs.value # # Model class - analyze variables as a single unit model = pm.Model( [obs, lambda_, lambda_1, lambda_2, taus] ) # # Creating new datasets # maxdays = 80 tau = pm.rdiscrete_uniform( 0, maxdays ) alpha = 1 / 20. lambda_1, lambda_2 = pm.rexponential( alpha, 2 ) data = np.r_[ pm.rpoisson( lambda_1, tau ), pm.rpoisson( lambda_2, maxdays-tau )] plt.bar( np.arange(maxdays), data ) plt.bar( tau - 1, data[tau-1], color = 'r', label='change point' ) plt.xlabel( "Time (days)" ) plt.ylabel( "count" ) plt.title( "Artificial Data" ) plt.xlim( 0, 80 ) plt.legend()
import numpy as np import pymc as pm from matplotlib import pyplot as plt true_N = 500 D = pm.rdiscrete_uniform(1, true_N, size=10) N = pm.DiscreteUniform("N", lower=D.max(), upper=10000) observation = pm.DiscreteUniform("obs", lower=0, upper=N, value=D, observed=True) model = pm.Model([observation, N]) mcmc = pm.MCMC(model) mcmc.sample(40000, 10000, 1) N_samples = mcmc.trace('N')[:] # histogram of the samples: plt.hist(N_samples, normed=True) plt.show()
from IPython.core.pylabtools import figsize from matplotlib import pyplot as plt figsize(12.5, 4) samples = [lambda_1.random() for i in range(20000)] plt.hist(samples, bins=70, normed=True, histtype="stepfilled") plt.title("Prior distribution for $\lambda_1$") plt.xlim(0, 8); # Take the case of the sms data in the previous chapter, knowing what we do # about parent and child variables and taking an omniscient view on the data # and determining a modeling procedure we can work backwards to create the # data mimicing the expected creation of the data. i.e. tau = pm.rdiscrete_uniform(0, 80) print( tau ) alpha = 1. / 20. lambda_1, lambda_2 = pm.rexponential(alpha, 2) print( lambda_1, lambda_2) data = np.r_[pm.rpoisson(lambda_1, tau), pm.rpoisson(lambda_2, 80 - tau)] # Plot the distribution plt.bar(np.arange(80), data, color="#348ABD") plt.bar(tau - 1, data[tau - 1], color="r", label="user behaviour changed") plt.xlabel("Time (days)") plt.ylabel("count of text-msgs received") plt.title("Artificial dataset")