|
20 | 20 | import numpy as np |
21 | 21 | import matplotlib.pyplot as plt |
22 | 22 |
|
23 | | -from fadin.utils.utils_simu import simu_marked_hawkes_cluster, custom_density |
24 | | -from fadin.utils.utils_simu import simu_multi_poisson |
| 23 | +from fadin.utils.utils_simu import simulate_marked_data |
25 | 24 | from fadin.solver import UNHaP |
26 | | -from fadin.utils.functions import identity, linear_zero_one |
27 | | -from fadin.utils.functions import reverse_linear_zero_one, truncated_gaussian |
28 | 25 | from fadin.utils.vis import plot |
29 | 26 |
|
30 | 27 |
|
31 | | -# %% Fixing the parameter of the simulation setting |
| 28 | +# %% Fix the simulation and solver parameters |
32 | 29 |
|
33 | 30 | baseline = np.array([0.3]) |
34 | 31 | baseline_noise = np.array([0.05]) |
|
37 | 34 | sigma = np.array([[0.1]]) |
38 | 35 |
|
39 | 36 | delta = 0.01 |
40 | | -end_time = 10000 |
| 37 | +end_time = 1000 |
41 | 38 | seed = 0 |
42 | | -max_iter = 20000 |
| 39 | +max_iter = 2000 |
43 | 40 | batch_rho = 200 |
44 | 41 |
|
45 | | -# %% Create the simulating function |
46 | | - |
47 | | - |
48 | | -def simulate_data(baseline, baseline_noise, alpha, end_time, seed=0): |
49 | | - n_dim = len(baseline) |
50 | | - |
51 | | - marks_kernel = identity |
52 | | - marks_density = linear_zero_one |
53 | | - time_kernel = truncated_gaussian |
54 | | - |
55 | | - params_marks_density = dict() |
56 | | - # params_marks_density = dict(scale=1) |
57 | | - params_marks_kernel = dict(slope=1.2) |
58 | | - params_time_kernel = dict(mu=mu, sigma=sigma) |
59 | | - |
60 | | - marked_events, _ = simu_marked_hawkes_cluster( |
61 | | - end_time, |
62 | | - baseline, |
63 | | - alpha, |
64 | | - time_kernel, |
65 | | - marks_kernel, |
66 | | - marks_density, |
67 | | - params_marks_kernel=params_marks_kernel, |
68 | | - params_marks_density=params_marks_density, |
69 | | - time_kernel_length=None, |
70 | | - marks_kernel_length=None, |
71 | | - params_time_kernel=params_time_kernel, |
72 | | - random_state=seed, |
73 | | - ) |
74 | | - |
75 | | - noisy_events_ = simu_multi_poisson(end_time, [baseline_noise]) |
76 | | - |
77 | | - random_marks = [np.random.rand(noisy_events_[i].shape[0]) for i in range(n_dim)] |
78 | | - noisy_marks = [ |
79 | | - custom_density( |
80 | | - reverse_linear_zero_one, |
81 | | - dict(), |
82 | | - size=noisy_events_[i].shape[0], |
83 | | - kernel_length=1.0, |
84 | | - ) |
85 | | - for i in range(n_dim) |
86 | | - ] |
87 | | - noisy_events = [ |
88 | | - np.concatenate( |
89 | | - (noisy_events_[i].reshape(-1, 1), random_marks[i].reshape(-1, 1)), axis=1 |
90 | | - ) |
91 | | - for i in range(n_dim) |
92 | | - ] |
93 | | - |
94 | | - events = [ |
95 | | - np.concatenate((noisy_events[i], marked_events[i]), axis=0) |
96 | | - for i in range(n_dim) |
97 | | - ] |
98 | | - |
99 | | - events_cat = [events[i][events[i][:, 0].argsort()] for i in range(n_dim)] |
100 | | - |
101 | | - labels = [ |
102 | | - np.zeros(marked_events[i].shape[0] + noisy_events_[i].shape[0]) |
103 | | - for i in range(n_dim) |
104 | | - ] |
105 | | - labels[0][-marked_events[0].shape[0] :] = 1.0 |
106 | | - true_rho = [labels[i][events[i][:, 0].argsort()] for i in range(n_dim)] |
107 | | - # put the mark to one to test the impact of the marks |
108 | | - # events_cat[0][:, 1] = 1. |
109 | | - |
110 | | - return events_cat, noisy_marks, true_rho |
111 | | - |
112 | | - |
113 | | -ev, noisy_marks, true_rho = simulate_data( |
114 | | - baseline, baseline_noise.item(), alpha, end_time, seed=0 |
| 42 | +# %% Simulate Hawkes Process with truncated Gaussian kernel and Poisson noise |
| 43 | + |
| 44 | +ev, noisy_marks, true_rho = simulate_marked_data( |
| 45 | + baseline, baseline_noise.item(), alpha, end_time, mu, sigma, seed=0 |
115 | 46 | ) |
116 | | -# %% Apply UNHAP |
| 47 | + |
| 48 | +# %% Let's take a closer look at the events |
| 49 | +print('Type of ev object', type(ev)) |
| 50 | +# ev is a list of numpy arrays, one for each dimension |
| 51 | +print('Number of events', len(ev[0])) |
| 52 | +print('Shape of first event array', ev[0].shape) |
| 53 | +# Each dimension is stored as a numpy array of shape (n_events, 2). |
| 54 | +print('First 10 events timestamps and marks', ev[0][:10]) |
| 55 | +# Each event is stored as [timestamp, mark]. |
| 56 | +# This is the expected data format for UNHaP. |
| 57 | +print('First event timestamp', ev[0][0][0]) |
| 58 | +print('First event mark', ev[0][0][1]) |
| 59 | +print('Second event timestamp', ev[0][1][0]) |
| 60 | +print('Second event mark', ev[0][1][1]) |
| 61 | + |
| 62 | +# %% Initiate and fit UNHAP to the simulated events |
117 | 63 |
|
118 | 64 | solver = UNHaP( |
119 | 65 | n_dim=1, |
120 | 66 | kernel="truncated_gaussian", |
121 | 67 | kernel_length=1.0, |
| 68 | + init='moment_matching_mean', |
122 | 69 | delta=delta, |
123 | 70 | optim="RMSprop", |
124 | 71 | params_optim={"lr": 1e-3}, |
125 | 72 | max_iter=max_iter, |
126 | 73 | batch_rho=batch_rho, |
127 | 74 | density_hawkes="linear", |
128 | 75 | density_noise="uniform", |
129 | | - moment_matching=True, |
130 | 76 | ) |
131 | 77 | solver.fit(ev, end_time) |
132 | 78 |
|
133 | 79 | # %% Print estimated parameters |
134 | 80 |
|
135 | | -print("Estimated baseline is: ", solver.param_baseline[-10:].mean().item()) |
136 | | -print("Estimated alpha is: ", solver.param_alpha[-10:].mean().item()) |
137 | | -print("Estimated kernel mean is: ", (solver.param_kernel[0][-10:].mean().item())) |
138 | | -print("Estimated kernel sd is: ", solver.param_kernel[1][-10:].mean().item()) |
139 | | -print("Estimated noise baseline is: ", solver.param_baseline_noise[-10:].mean().item()) |
| 81 | +print("Estimated baseline is: ", solver.baseline_.item()) |
| 82 | +print("Estimated alpha is: ", solver.alpha_.item()) |
| 83 | +print("Estimated kernel mean is: ", solver.kernel_[0].item()) |
| 84 | +print("Estimated kernel sd is: ", solver.kernel_[1].item()) |
| 85 | +print("Estimated noise baseline is: ", solver.baseline_noise_.item()) |
140 | 86 | # error on params |
141 | | -error_baseline = (solver.param_baseline[-10:].mean().item() - baseline.item()) ** 2 |
142 | | -error_baseline_noise = ( |
143 | | - solver.param_baseline_noise[-10:].mean().item() - baseline_noise.item() |
| 87 | +error_bl = (solver.baseline_.item() - baseline.item()) ** 2 |
| 88 | +error_bl_noise = ( |
| 89 | + solver.baseline_noise_.item() - baseline_noise.item() |
144 | 90 | ) ** 2 |
145 | | -error_alpha = (solver.param_alpha[-10:].mean().item() - alpha.item()) ** 2 |
146 | | -error_mu = (solver.param_kernel[0][-10:].mean().item() - 0.5) ** 2 |
147 | | -error_sigma = (solver.param_kernel[1][-10:].mean().item() - 0.1) ** 2 |
148 | | -sum_error = error_baseline + error_baseline_noise + error_alpha + error_mu + error_sigma |
| 91 | +error_alpha = (solver.alpha_.item() - alpha.item()) ** 2 |
| 92 | +error_mu = (solver.kernel_[0].item() - mu.item()) ** 2 |
| 93 | +error_sigma = (solver.kernel_[1].item() - sigma.item()) ** 2 |
| 94 | +sum_error = error_bl + error_bl_noise + error_alpha + error_mu + error_sigma |
149 | 95 | error_params = np.sqrt(sum_error) |
150 | 96 |
|
151 | | -print("L2 square errors of the vector of parameters is:", error_params) |
| 97 | +print("L2 square error of the vector of parameters is:", error_params) |
152 | 98 |
|
153 | 99 | # %% Plot estimated parameters |
154 | | -fig, axs = plot(solver, plotfig=False, bl_noise=True, title="UNHaP fit", savefig=None) |
| 100 | +fig, axs = plot( |
| 101 | + solver, |
| 102 | + plotfig=False, |
| 103 | + bl_noise=True, |
| 104 | + title="UNHaP fit", |
| 105 | + savefig=None |
| 106 | +) |
155 | 107 | plt.show(block=True) |
156 | | -# %% |
0 commit comments