def sample_from_network_hawkes(C, K, T, dt, dt_max, B): # Create a true model p = 0.8 * np.eye(C) v = 10.0 * np.eye(C) + 20.0 * (1 - np.eye(C)) c = (0.0 * (np.arange(K) < 10) + 1.0 * (np.arange(K) >= 10)).astype(np.int) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(C=C, K=K, dt=dt, dt_max=dt_max, B=B, c=c, p=p, v=v) # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W, vmax=0.5) # Sample from the true model S, R = true_model.generate(T=T) # Return the spike count matrix return S, true_model
def demo(K=3, T=1000, dt_max=20, p=0.25): """ :param K: Number of nodes :param T: Number of time bins to simulate :param dt_max: Number of future time bins an event can influence :param p: Sparsity of network :return: """ ########################################################### # Generate synthetic data ########################################################### network_hypers = {"p": p, "allow_self_connections": False} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network_hypers=network_hypers) assert true_model.check_stability() # Sample from the true model S,R = true_model.generate(T=T, keep=True, print_interval=50) plt.ion() true_figure, _ = true_model.plot(color="#377eb8", T_slice=(0,100)) ########################################################### # Create a test spike and slab model ########################################################### test_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network_hypers=network_hypers) test_model.add_data(S) # Initialize plots test_figure, test_handles = test_model.plot(color="#e41a1c", T_slice=(0,100)) ########################################################### # Fit the test model with Gibbs sampling ########################################################### N_samples = 100 samples = [] lps = [] for itr in range(N_samples): print("Gibbs iteration ", itr) test_model.resample_model() lps.append(test_model.log_probability()) samples.append(test_model.copy_sample()) # Update plots test_model.plot(handles=test_handles) ########################################################### # Analyze the samples ########################################################### analyze_samples(true_model, samples, lps)
def demo(K=3, T=1000, dt_max=20, p=0.25): """ :param K: Number of nodes :param T: Number of time bins to simulate :param dt_max: Number of future time bins an event can influence :param p: Sparsity of network :return: """ ########################################################### # Generate synthetic data ########################################################### network_hypers = {"p": p, "allow_self_connections": False} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network_hypers=network_hypers) assert true_model.check_stability() # Sample from the true model S,R = true_model.generate(T=T, keep=True, print_interval=50) plt.ion() true_figure, _ = true_model.plot(color="#377eb8", T_slice=(0,100)) ########################################################### # Create a test spike and slab model ########################################################### test_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network_hypers=network_hypers) test_model.add_data(S) # Initialize plots test_figure, test_handles = test_model.plot(color="#e41a1c", T_slice=(0,100)) ########################################################### # Fit the test model with Gibbs sampling ########################################################### N_samples = 100 samples = [] lps = [] for itr in xrange(N_samples): print "Gibbs iteration ", itr test_model.resample_model() lps.append(test_model.log_probability()) samples.append(test_model.copy_sample()) # Update plots test_model.plot(handles=test_handles) ########################################################### # Analyze the samples ########################################################### analyze_samples(true_model, samples, lps)
def sample_from_network_hawkes(K, T, dt, dt_max, B): # Create a true model true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, dt_max=dt_max, B=B, network_hypers=dict(p=0.1)) # Plot the true network plt.ion() true_model.plot_network() # Sample from the true model S,R = true_model.generate(T=T) # Return the spike count matrix return S, true_model
def test_compute_rate(): K = 1 T = 100 dt = 1.0 true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt) S, R = true_model.generate(T=T) print "Expected number of events: ", np.trapz(R, dt * np.arange(T), axis=0) print "Actual number of events: ", S.sum(axis=0) print "Lambda0: ", true_model.bias_model.lambda0 print "W: ", true_model.weight_model.W print "" R_test = true_model.compute_rate() assert np.allclose(R, R_test)
def test_generate_statistics(): K = 1 T = 100 dt = 1.0 true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt) S, R = true_model.generate(T=T) E_N = np.trapz(R, dt * np.arange(T), axis=0) std_N = np.sqrt(E_N) N = S.sum(axis=0) assert np.all(N >= E_N - 3 * std_N), "N less than 3std below mean" assert np.all(N <= E_N + 3 * std_N), "N more than 3std above mean" print "Expected number of events: ", E_N print "Actual number of events: ", S.sum(axis=0)
def generate_hawkes(edges): """ UNDER CONSTRUCTION. Will need the package pyhawkes. Generates firing times of N individuals in a given network defined by edges. """ from pyhawkes.models import DiscreteTimeNetworkHawkesModelSpikeAndSlab np.random.seed(1122334455) # Create a simple random network with K nodes a sparsity level of p # Each event induces impulse responses of length dt_max on connected nodes a = set() for edge in edges: a.add(edge[0]) a.add(edge[1]) K = len(a) p = 0.25 dt_max = 20 network_hypers = {"p": p, "allow_self_connections": False} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network_hypers=network_hypers) A2 = np.zeros((K, K)) for edge in edges: A2[edge[0]][edge[1]] = 1.0 true_model.weight_model.A = A2 A3 = 0.5 * np.ones((K, K)) true_model.weight_model.W = A3 Tmax = 50000 S, R = true_model.generate(T=Tmax) times = dict() for idi in range(K): for it in range(Tmax): n = S[it][idi] if n > 0: if idi not in times.keys(): times[idi] = [] else: times[idi].append(it) ids = list(times.keys()) for idn in ids: times[idn].sort() return ids, times
def sample_from_network_hawkes(C, K, T, dt, B): # Create a true model p = 0.8 * np.eye(C) v = 10.0 * np.eye(C) + 20.0 * (1-np.eye(C)) c = (0.0 * (np.arange(K) < 10) + 1.0 * (np.arange(K) >= 10)).astype(np.int) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(C=C, K=K, dt=dt, B=B, c=c, p=p, v=v) # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W, vmax=0.5) # Sample from the true model S,R = true_model.generate(T=T) # Return the spike count matrix return S, R, true_model
def test_compute_rate(): K = 1 T = 100 dt = 1.0 network_hypers = {'c': np.zeros(K, dtype=np.int), 'p': 1.0, 'kappa': 10.0, 'v': 10*5.0} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, network_hypers=network_hypers) S,R = true_model.generate(T=T) print "Expected number of events: ", np.trapz(R, dt * np.arange(T), axis=0) print "Actual number of events: ", S.sum(axis=0) print "Lambda0: ", true_model.bias_model.lambda0 print "W: ", true_model.weight_model.W print "" R_test = true_model.compute_rate() assert np.allclose(R, R_test)
def test_generate_statistics(): K = 1 T = 100 dt = 1.0 network_hypers = {'c': np.zeros(K, dtype=np.int), 'p': 1.0, 'kappa': 10.0, 'v': 10*5.0} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, network_hypers=network_hypers) S,R = true_model.generate(T=T) E_N = np.trapz(R, dt * np.arange(T), axis=0) std_N = np.sqrt(E_N) N = S.sum(axis=0) assert np.all(N >= E_N - 3*std_N), "N less than 3std below mean" assert np.all(N <= E_N + 3*std_N), "N more than 3std above mean" print "Expected number of events: ", E_N print "Actual number of events: ", S.sum(axis=0)
def test_gibbs_sbm(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ if seed is None: seed = np.random.randint(2**32) print("Setting seed to ", seed) np.random.seed(seed) C = 2 K = 100 c = np.arange(C).repeat(np.ceil(K / float(C)))[:K] T = 1000 dt = 1.0 B = 3 # Generate from a true model true_p = np.random.rand(C, C) * 0.25 true_network = StochasticBlockModel(K, C, c=c, p=true_p, v=10.0) true_model = \ DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt=dt, B=B, network=true_network) S, R = true_model.generate(T) # Plot the true network plt.ion() true_im = true_model.plot_adjacency_matrix() plt.pause(0.001) # Make a new model for inference test_network = StochasticBlockModel(K, C, beta=1. / K) test_model = \ DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt=dt, B=B, network=test_network) test_model.add_data(S) # Gibbs sample N_samples = 100 c_samples = [] lps = [] for itr in progprint_xrange(N_samples): c_samples.append(test_network.c.copy()) lps.append(test_model.log_probability()) # Resample the network only test_model.network.resample( (true_model.weight_model.A, true_model.weight_model.W)) c_samples = np.array(c_samples) plt.ioff() # Compute sample statistics for second half of samples print("True c: ", true_model.network.c) print("Test c: ", c_samples[-10:, :]) # Compute the adjusted mutual info score of the clusterings amis = [] arss = [] for c in c_samples: amis.append(adjusted_mutual_info_score(true_model.network.c, c)) arss.append(adjusted_rand_score(true_model.network.c, c)) plt.figure() plt.plot(np.arange(N_samples), amis, '-r') plt.plot(np.arange(N_samples), arss, '-b') plt.xlabel("Iteration") plt.ylabel("Clustering score") plt.show()
def geweke_test(): """ Create a discrete time Hawkes model and generate from it. :return: """ T = 50 dt = 1.0 dt_max = 3.0 network_hypers = { 'C': 1, 'p': 0.5, 'kappa': 3.0, 'alpha': 3.0, 'beta': 1.0 / 20.0 } model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=1, dt=dt, dt_max=dt_max, network_hypers=network_hypers) model.generate(T=T) # Gibbs sample and then generate new data N_samples = 10000 samples = [] lps = [] for itr in xrange(N_samples): if itr % 10 == 0: print "Iteration: ", itr # Resample the model model.resample_model() samples.append(model.copy_sample()) lps.append(model.log_probability()) # Geweke step model.data_list.pop() model.generate(T=T) # Compute sample statistics for second half of samples A_samples = np.array([s.weight_model.A for s in samples]) W_samples = np.array([s.weight_model.W for s in samples]) g_samples = np.array([s.impulse_model.g for s in samples]) lambda0_samples = np.array([s.bias_model.lambda0 for s in samples]) c_samples = np.array([s.network.c for s in samples]) p_samples = np.array([s.network.p for s in samples]) v_samples = np.array([s.network.v for s in samples]) lps = np.array(lps) offset = 0 A_mean = A_samples[offset:, ...].mean(axis=0) W_mean = W_samples[offset:, ...].mean(axis=0) g_mean = g_samples[offset:, ...].mean(axis=0) lambda0_mean = lambda0_samples[offset:, ...].mean(axis=0) print "A mean: ", A_mean print "W mean: ", W_mean print "g mean: ", g_mean print "lambda0 mean: ", lambda0_mean # Plot the log probability over iterations plt.figure() plt.plot(np.arange(N_samples), lps) plt.xlabel("Iteration") plt.ylabel("Log probability") # Plot the histogram of bias samples plt.figure() p_lmbda0 = gamma(model.bias_model.alpha, scale=1. / model.bias_model.beta) _, bins, _ = plt.hist(lambda0_samples[:, 0], bins=20, alpha=0.5, normed=True) bincenters = 0.5 * (bins[1:] + bins[:-1]) plt.plot(bincenters, p_lmbda0.pdf(bincenters), 'r--', linewidth=1) plt.xlabel('lam0') plt.ylabel('p(lam0)') print "Expected p(A): ", model.network.P print "Empirical p(A): ", A_samples.mean(axis=0) # Plot the histogram of weight samples plt.figure() Aeq1 = A_samples[:, 0, 0] == 1 # p_W1 = gamma(model.network.kappa, scale=1./model.network.v[0,0]) # The marginal distribution of W under a gamma prior on the scale # is a beta prime distribution p_W1 = betaprime(model.network.kappa, model.network.alpha, scale=model.network.beta) _, bins, _ = plt.hist(W_samples[Aeq1, 0, 0], bins=20, alpha=0.5, normed=True) bincenters = 0.5 * (bins[1:] + bins[:-1]) plt.plot(bincenters, p_W1.pdf(bincenters), 'r--', linewidth=1) plt.xlabel('W') plt.ylabel('p(W | A=1)') # Plot the histogram of impulse samples plt.figure() for b in range(model.B): plt.subplot(1, model.B, b + 1) a = model.impulse_model.gamma[b] b = model.impulse_model.gamma.sum() - a p_beta11b = beta(a, b) _, bins, _ = plt.hist(g_samples[:, 0, 0, b], bins=20, alpha=0.5, normed=True) bincenters = 0.5 * (bins[1:] + bins[:-1]) plt.plot(bincenters, p_beta11b.pdf(bincenters), 'r--', linewidth=1) plt.xlabel('g_%d' % b) plt.ylabel('p(g_%d)' % b) # Plot the histogram of weight scale plt.figure() for c1 in range(model.C): for c2 in range(model.C): plt.subplot(model.C, model.C, 1 + c1 * model.C + c2) p_v = gamma(model.network.alpha, scale=1. / model.network.beta) _, bins, _ = plt.hist(v_samples[:, c1, c2], bins=20, alpha=0.5, normed=True) bincenters = 0.5 * (bins[1:] + bins[:-1]) plt.plot(bincenters, p_v.pdf(bincenters), 'r--', linewidth=1) plt.xlabel('v_{%d,%d}' % (c1, c2)) plt.ylabel('p(v)') plt.show()
""" Create a discrete time Hawkes model and generate from it. :return: """ K = 1 T = 50 dt = 1.0 dt_max = 3.0 # network_hypers = {'C': 1, 'p': 0.5, 'kappa': 3.0, 'alpha': 3.0, 'beta': 1.0/20.0} network_hypers = {'c': np.zeros(K, dtype=np.int), 'p': 0.5, 'kappa': 10.0, 'v': 10*3.0} bkgd_hypers = {"alpha": 1., "beta": 10.} model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, dt_max=dt_max, weight_hypers={"parallel_resampling": False}, network_hypers=network_hypers) model.generate(T=T) # Gibbs sample and then generate new data N_samples = 10000 samples = [] lps = [] for itr in progprint_xrange(N_samples, perline=50): # Resample the model model.resample_model() samples.append(model.copy_sample()) lps.append(model.log_likelihood()) # Geweke step model.data_list.pop() model.generate(T=T)
def generate_synthetic_data(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ if seed is None: seed = np.random.randint(2**32) print("Setting seed to ", seed) np.random.seed(seed) # Create a true model # Larger v (weight scale) implies smaller weights T_test = 1000 # Debugging network: # C = 1 # K = 4 # T = 1000 # dt = 1.0 # B = 3 # p = 0.5 # kappa = 3.0 # v = kappa * 5.0 # c = np.zeros(K, dtype=np.int) # Small network: # Seed: 1957629166 # C = 4 # K = 20 # T = 10000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.9 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (5.0 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Medium network: # Seed: 2723361959 # C = 5 # K = 50 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.75 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (9 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Medium netowrk 2: # Seed = 3848328624 # C = 5 # K = 50 # T = 100000 # dt = 1.0 # B = 3 # kappa = 2.0 # c = np.arange(C).repeat((K // C)) # p = 0.4 * np.eye(C) + 0.01 * (1-np.eye(C)) # v = kappa * (5 * np.eye(C) + 5.0 * (1-np.eye(C))) # Medium netowrk, one cluster # Seed: 3848328624 C = 1 K = 50 T = 100000 dt = 1.0 B = 3 p = 0.08 kappa = 3.0 v = kappa * 5.0 c = np.zeros(K, dtype=np.int) # Large network: # Seed = 2467634490 # C = 5 # K = 100 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.4 * np.eye(C) + 0.025 * (1-np.eye(C)) # v = kappa * (10 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Large network 2: # Seed = # C = 10 # K = 100 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.75 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (9 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Extra large network: # Seed: 2327447870 # C = 20 # K = 1000 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.25 * np.eye(C) + 0.0025 * (1-np.eye(C)) # v = kappa * (15 * np.eye(C) + 30.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Create the model with these parameters network_hypers = {'C': C, 'kappa': kappa, 'c': c, 'p': p, 'v': v} # Create a simple network from pyhawkes.internals.network import ErdosRenyiFixedSparsity network = ErdosRenyiFixedSparsity(K, p, kappa, v=v) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, B=B, network=network) assert true_model.check_stability() # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W) plt.pause(0.001) # Sample from the true model S, R = true_model.generate(T=T, keep=False, print_interval=50) # Pickle and save the data out_dir = os.path.join('data', "synthetic") out_name = 'synthetic_K%d_C%d_T%d.pkl.gz' % (K, C, T) out_path = os.path.join(out_dir, out_name) with gzip.open(out_path, 'w') as f: print("Saving output to ", out_path) pickle.dump((S, true_model), f, protocol=-1) # Sample test data S_test, _ = true_model.generate(T=T_test, keep=False) # Pickle and save the data out_dir = os.path.join('data', "synthetic") out_name = 'synthetic_test_K%d_C%d_T%d.pkl.gz' % (K, C, T_test) out_path = os.path.join(out_dir, out_name) with gzip.open(out_path, 'w') as f: print("Saving output to ", out_path) pickle.dump((S_test, true_model), f, protocol=-1)
dt_max = 3.0 # network_hypers = {'C': 1, 'p': 0.5, 'kappa': 3.0, 'alpha': 3.0, 'beta': 1.0/20.0} network_hypers = { 'c': np.zeros(K, dtype=np.int), 'p': 0.5, 'kappa': 10.0, 'v': 10 * 3.0 } bkgd_hypers = {"alpha": 1., "beta": 10.} model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt=dt, dt_max=dt_max, weight_hypers={"parallel_resampling": False}, network_hypers=network_hypers) model.generate(T=T) # Gibbs sample and then generate new data N_samples = 10000 samples = [] lps = [] for itr in progprint_xrange(N_samples, perline=50): # Resample the model model.resample_model() samples.append(model.copy_sample()) lps.append(model.log_likelihood()) # Geweke step model.data_list.pop() model.generate(T=T)
def test_gibbs_sbm(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ if seed is None: seed = np.random.randint(2**32) print("Setting seed to ", seed) np.random.seed(seed) C = 2 K = 100 c = np.arange(C).repeat(np.ceil(K/float(C)))[:K] T = 1000 dt = 1.0 B = 3 # Generate from a true model true_p = np.random.rand(C,C) * 0.25 true_network = StochasticBlockModel(K, C, c=c, p=true_p, v=10.0) true_model = \ DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt=dt, B=B, network=true_network) S,R = true_model.generate(T) # Plot the true network plt.ion() true_im = true_model.plot_adjacency_matrix() plt.pause(0.001) # Make a new model for inference test_network = StochasticBlockModel(K, C, beta=1./K) test_model = \ DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt=dt, B=B, network=test_network) test_model.add_data(S) # Gibbs sample N_samples = 100 c_samples = [] lps = [] for itr in progprint_xrange(N_samples): c_samples.append(test_network.c.copy()) lps.append(test_model.log_probability()) # Resample the network only test_model.network.resample((true_model.weight_model.A, true_model.weight_model.W)) c_samples = np.array(c_samples) plt.ioff() # Compute sample statistics for second half of samples print("True c: ", true_model.network.c) print("Test c: ", c_samples[-10:, :]) # Compute the adjusted mutual info score of the clusterings amis = [] arss = [] for c in c_samples: amis.append(adjusted_mutual_info_score(true_model.network.c, c)) arss.append(adjusted_rand_score(true_model.network.c, c)) plt.figure() plt.plot(np.arange(N_samples), amis, '-r') plt.plot(np.arange(N_samples), arss, '-b') plt.xlabel("Iteration") plt.ylabel("Clustering score") plt.show()
def demo(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ raise NotImplementedError("This example needs to be updated.") if seed is None: seed = np.random.randint(2**32) print "Setting seed to ", seed np.random.seed(seed) C = 1 K = 10 T = 1000 dt = 1.0 B = 3 # Create a true model p = 0.8 * np.eye(C) v = 10.0 * np.eye(C) + 20.0 * (1-np.eye(C)) # m = 0.5 * np.ones(C) c = (0.0 * (np.arange(K) < 10) + 1.0 * (np.arange(K) >= 10)).astype(np.int) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(C=C, K=K, dt=dt, B=B, c=c, p=p, v=v) # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W, vmax=0.5) plt.pause(0.001) # Sample from the true model S,R = true_model.generate(T=T) # Make a new model for inference test_model = DiscreteTimeStandardHawkesModel(K=K, dt=dt, B=B, beta=1.0) test_model.add_data(S) # Plot the true and inferred firing rate kplt = 0 plt.figure() plt.plot(np.arange(T), R[:,kplt], '-k', lw=2) plt.ion() ln = plt.plot(np.arange(T), test_model.compute_rate(ks=kplt), '-r')[0] plt.show() # Gradient descent N_steps = 10000 lls = [] for itr in xrange(N_steps): W,ll,grad = test_model.gradient_descent_step(stepsz=0.001) lls.append(ll) # Update plot if itr % 5 == 0: ln.set_data(np.arange(T), test_model.compute_rate(ks=kplt)) plt.title("Iteration %d" % itr) plt.pause(0.001) plt.ioff() print "W true: ", true_model.weight_model.A * true_model.weight_model.W print "lambda0 true: ", true_model.bias_model.lambda0 print "ll true: ", true_model.log_likelihood() print "" print "W test: ", test_model.W print "lambda0 test ", test_model.bias print "ll test: ", test_model.log_likelihood() plt.figure() plt.plot(np.arange(N_steps), lls) plt.xlabel("Iteration") plt.ylabel("Log likelihood") plot_network(np.ones((K,K)), test_model.W, vmax=0.5) plt.show()
def generate_synthetic_data(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ if seed is None: seed = np.random.randint(2**32) print "Setting seed to ", seed np.random.seed(seed) # Create a true model # Larger v (weight scale) implies smaller weights T_test=1000 # Debugging network: # C = 1 # K = 4 # T = 1000 # dt = 1.0 # B = 3 # p = 0.5 # kappa = 3.0 # v = kappa * 5.0 # c = np.zeros(K, dtype=np.int) # Small network: # Seed: 1957629166 # C = 4 # K = 20 # T = 10000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.9 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (5.0 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Medium network: # Seed: 2723361959 # C = 5 # K = 50 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.75 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (9 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Medium netowrk 2: # Seed = 3848328624 # C = 5 # K = 50 # T = 100000 # dt = 1.0 # B = 3 # kappa = 2.0 # c = np.arange(C).repeat((K // C)) # p = 0.4 * np.eye(C) + 0.01 * (1-np.eye(C)) # v = kappa * (5 * np.eye(C) + 5.0 * (1-np.eye(C))) # Medium netowrk, one cluster # Seed: 3848328624 C = 1 K = 50 T = 100000 dt = 1.0 B = 3 p = 0.08 kappa = 3.0 v = kappa * 5.0 c = np.zeros(K, dtype=np.int) # Large network: # Seed = 2467634490 # C = 5 # K = 100 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.4 * np.eye(C) + 0.025 * (1-np.eye(C)) # v = kappa * (10 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Large network 2: # Seed = # C = 10 # K = 100 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.75 * np.eye(C) + 0.05 * (1-np.eye(C)) # v = kappa * (9 * np.eye(C) + 25.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Extra large network: # Seed: 2327447870 # C = 20 # K = 1000 # T = 100000 # dt = 1.0 # B = 3 # kappa = 3.0 # p = 0.25 * np.eye(C) + 0.0025 * (1-np.eye(C)) # v = kappa * (15 * np.eye(C) + 30.0 * (1-np.eye(C))) # c = np.arange(C).repeat((K // C)) # Create the model with these parameters network_hypers = {'C': C, 'kappa': kappa, 'c': c, 'p': p, 'v': v} # Create a simple network from pyhawkes.internals.network import ErdosRenyiFixedSparsity network = ErdosRenyiFixedSparsity(K, p, kappa, v=v) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt=dt, B=B, network=network) assert true_model.check_stability() # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W) plt.pause(0.001) # Sample from the true model S,R = true_model.generate(T=T, keep=False, print_interval=50) # Pickle and save the data out_dir = os.path.join('data', "synthetic") out_name = 'synthetic_K%d_C%d_T%d.pkl.gz' % (K,C,T) out_path = os.path.join(out_dir, out_name) with gzip.open(out_path, 'w') as f: print "Saving output to ", out_path cPickle.dump((S, true_model), f, protocol=-1) # Sample test data S_test,_ = true_model.generate(T=T_test, keep=False) # Pickle and save the data out_dir = os.path.join('data', "synthetic") out_name = 'synthetic_test_K%d_C%d_T%d.pkl.gz' % (K,C,T_test) out_path = os.path.join(out_dir, out_name) with gzip.open(out_path, 'w') as f: print "Saving output to ", out_path cPickle.dump((S_test, true_model), f, protocol=-1)
def demo(K=3, T=1000, dt_max=20, p=0.25): """ :param K: Number of nodes :param T: Number of time bins to simulate :param dt_max: Number of future time bins an event can influence :param p: Sparsity of network :return: """ ########################################################### # Generate synthetic data ########################################################### network = ErdosRenyiFixedSparsity(K, p, v=1., allow_self_connections=False) bkgd_hypers = {"alpha": 1.0, "beta": 20.0} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, bkgd_hypers=bkgd_hypers, network=network) A_true = np.zeros((K,K)) A_true[0,1] = A_true[0,2] = 1 W_true = np.zeros((K,K)) W_true[0,1] = W_true[0,2] = 1.0 true_model.weight_model.A = A_true true_model.weight_model.W = W_true true_model.bias_model.lambda0[0] = 0.2 assert true_model.check_stability() # Sample from the true model S,R = true_model.generate(T=T, keep=True, print_interval=50) plt.ion() true_figure, _ = true_model.plot(color="#377eb8", T_slice=(0,100)) # Save the true figure true_figure.savefig("gifs/true.gif") ########################################################### # Create a test spike and slab model ########################################################### test_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, network=network) test_model.add_data(S) # Initialize plots test_figure, test_handles = test_model.plot(color="#e41a1c", T_slice=(0,100)) test_figure.savefig("gifs/test0.gif") ########################################################### # Fit the test model with Gibbs sampling ########################################################### N_samples = 100 samples = [] lps = [] for itr in xrange(N_samples): print "Gibbs iteration ", itr test_model.resample_model() lps.append(test_model.log_probability()) samples.append(test_model.copy_sample()) # Update plots test_model.plot(handles=test_handles) test_figure.savefig("gifs/test%d.gif" % (itr+1))
def demo(K=3, T=1000, dt_max=20, p=0.25): """ :param K: Number of nodes :param T: Number of time bins to simulate :param dt_max: Number of future time bins an event can influence :param p: Sparsity of network :return: """ ########################################################### # Generate synthetic data ########################################################### network = ErdosRenyiFixedSparsity(K, p, v=1., allow_self_connections=False) bkgd_hypers = {"alpha": 1.0, "beta": 20.0} true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab( K=K, dt_max=dt_max, bkgd_hypers=bkgd_hypers, network=network) A_true = np.zeros((K, K)) A_true[0, 1] = A_true[0, 2] = 1 W_true = np.zeros((K, K)) W_true[0, 1] = W_true[0, 2] = 1.0 true_model.weight_model.A = A_true true_model.weight_model.W = W_true true_model.bias_model.lambda0[0] = 0.2 assert true_model.check_stability() # Sample from the true model S, R = true_model.generate(T=T, keep=True, print_interval=50) plt.ion() true_figure, _ = true_model.plot(color="#377eb8", T_slice=(0, 100)) # Save the true figure true_figure.savefig("gifs/true.gif") ########################################################### # Create a test spike and slab model ########################################################### test_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(K=K, dt_max=dt_max, network=network) test_model.add_data(S) # Initialize plots test_figure, test_handles = test_model.plot(color="#e41a1c", T_slice=(0, 100)) test_figure.savefig("gifs/test0.gif") ########################################################### # Fit the test model with Gibbs sampling ########################################################### N_samples = 100 samples = [] lps = [] for itr in xrange(N_samples): print "Gibbs iteration ", itr test_model.resample_model() lps.append(test_model.log_probability()) samples.append(test_model.copy_sample()) # Update plots test_model.plot(handles=test_handles) test_figure.savefig("gifs/test%d.gif" % (itr + 1))
def demo(seed=None): """ Create a discrete time Hawkes model and generate from it. :return: """ if seed is None: seed = np.random.randint(2**32) print "Setting seed to ", seed np.random.seed(seed) C = 1 K = 10 T = 1000 dt = 1.0 B = 3 # Create a true model p = 0.8 * np.eye(C) v = 10.0 * np.eye(C) + 20.0 * (1 - np.eye(C)) # m = 0.5 * np.ones(C) c = (0.0 * (np.arange(K) < 10) + 1.0 * (np.arange(K) >= 10)).astype(np.int) true_model = DiscreteTimeNetworkHawkesModelSpikeAndSlab(C=C, K=K, dt=dt, B=B, c=c, p=p, v=v) # Plot the true network plt.ion() plot_network(true_model.weight_model.A, true_model.weight_model.W, vmax=0.5) plt.pause(0.001) # Sample from the true model S, R = true_model.generate(T=T) # Make a new model for inference test_model = DiscreteTimeStandardHawkesModel(K=K, dt=dt, B=B, beta=1.0) test_model.add_data(S) # Plot the true and inferred firing rate kplt = 0 plt.figure() plt.plot(np.arange(T), R[:, kplt], '-k', lw=2) plt.ion() ln = plt.plot(np.arange(T), test_model.compute_rate(ks=kplt), '-r')[0] plt.show() # Gradient descent N_steps = 10000 lls = [] for itr in xrange(N_steps): W, ll, grad = test_model.gradient_descent_step(stepsz=0.001) lls.append(ll) # Update plot if itr % 5 == 0: ln.set_data(np.arange(T), test_model.compute_rate(ks=kplt)) plt.title("Iteration %d" % itr) plt.pause(0.001) plt.ioff() print "W true: ", true_model.weight_model.A * true_model.weight_model.W print "lambda0 true: ", true_model.bias_model.lambda0 print "ll true: ", true_model.log_likelihood() print "" print "W test: ", test_model.W print "lambda0 test ", test_model.bias print "ll test: ", test_model.log_likelihood() plt.figure() plt.plot(np.arange(N_steps), lls) plt.xlabel("Iteration") plt.ylabel("Log likelihood") plot_network(np.ones((K, K)), test_model.W, vmax=0.5) plt.show()