Skip to content

Commit edffa71

Browse files
FaDIn GitHub ActionFaDIn GitHub Action
authored andcommitted
Update documentation
1 parent 54d38d5 commit edffa71

38 files changed

Lines changed: 668 additions & 18713 deletions
Binary file not shown.

_downloads/1c3b32a31630f6e84287c7300eec1f0b/plot_unhap.ipynb

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
},
3434
"outputs": [],
3535
"source": [
36-
"import numpy as np\nimport matplotlib.pyplot as plt\n\nfrom fadin.utils.utils_simu import simu_marked_hawkes_cluster, custom_density\nfrom fadin.utils.utils_simu import simu_multi_poisson\nfrom fadin.solver import UNHaP\nfrom fadin.utils.functions import identity, linear_zero_one\nfrom fadin.utils.functions import reverse_linear_zero_one, truncated_gaussian\nfrom fadin.utils.vis import plot"
36+
"import numpy as np\nimport matplotlib.pyplot as plt\n\nfrom fadin.utils.utils_simu import simulate_marked_data\nfrom fadin.solver import UNHaP\nfrom fadin.utils.vis import plot"
3737
]
3838
},
3939
{
@@ -44,7 +44,7 @@
4444
},
4545
"outputs": [],
4646
"source": [
47-
"baseline = np.array([0.3])\nbaseline_noise = np.array([0.05])\nalpha = np.array([[1.45]])\nmu = np.array([[0.4]])\nsigma = np.array([[0.1]])\n\ndelta = 0.01\nend_time = 10000\nseed = 0\nmax_iter = 20000\nbatch_rho = 200"
47+
"baseline = np.array([0.3])\nbaseline_noise = np.array([0.05])\nalpha = np.array([[1.45]])\nmu = np.array([[0.4]])\nsigma = np.array([[0.1]])\n\ndelta = 0.01\nend_time = 1000\nseed = 0\nmax_iter = 2000\nbatch_rho = 200"
4848
]
4949
},
5050
{
@@ -55,7 +55,7 @@
5555
},
5656
"outputs": [],
5757
"source": [
58-
"def simulate_data(baseline, baseline_noise, alpha, end_time, seed=0):\n n_dim = len(baseline)\n\n marks_kernel = identity\n marks_density = linear_zero_one\n time_kernel = truncated_gaussian\n\n params_marks_density = dict()\n # params_marks_density = dict(scale=1)\n params_marks_kernel = dict(slope=1.2)\n params_time_kernel = dict(mu=mu, sigma=sigma)\n\n marked_events, _ = simu_marked_hawkes_cluster(\n end_time,\n baseline,\n alpha,\n time_kernel,\n marks_kernel,\n marks_density,\n params_marks_kernel=params_marks_kernel,\n params_marks_density=params_marks_density,\n time_kernel_length=None,\n marks_kernel_length=None,\n params_time_kernel=params_time_kernel,\n random_state=seed,\n )\n\n noisy_events_ = simu_multi_poisson(end_time, [baseline_noise])\n\n random_marks = [np.random.rand(noisy_events_[i].shape[0]) for i in range(n_dim)]\n noisy_marks = [\n custom_density(\n reverse_linear_zero_one,\n dict(),\n size=noisy_events_[i].shape[0],\n kernel_length=1.0,\n )\n for i in range(n_dim)\n ]\n noisy_events = [\n np.concatenate(\n (noisy_events_[i].reshape(-1, 1), random_marks[i].reshape(-1, 1)), axis=1\n )\n for i in range(n_dim)\n ]\n\n events = [\n np.concatenate((noisy_events[i], marked_events[i]), axis=0)\n for i in range(n_dim)\n ]\n\n events_cat = [events[i][events[i][:, 0].argsort()] for i in range(n_dim)]\n\n labels = [\n np.zeros(marked_events[i].shape[0] + noisy_events_[i].shape[0])\n for i in range(n_dim)\n ]\n labels[0][-marked_events[0].shape[0] :] = 1.0\n true_rho = [labels[i][events[i][:, 0].argsort()] for i in range(n_dim)]\n # put the mark to one to test the impact of the marks\n # events_cat[0][:, 1] = 1.\n\n return events_cat, noisy_marks, true_rho\n\n\nev, noisy_marks, true_rho = simulate_data(\n baseline, baseline_noise.item(), alpha, end_time, seed=0\n)"
58+
"ev, noisy_marks, true_rho = simulate_marked_data(\n baseline, baseline_noise.item(), alpha, end_time, mu, sigma, seed=0\n)"
5959
]
6060
},
6161
{
@@ -66,7 +66,7 @@
6666
},
6767
"outputs": [],
6868
"source": [
69-
"solver = UNHaP(\n n_dim=1,\n kernel=\"truncated_gaussian\",\n kernel_length=1.0,\n delta=delta,\n optim=\"RMSprop\",\n params_optim={\"lr\": 1e-3},\n max_iter=max_iter,\n batch_rho=batch_rho,\n density_hawkes=\"linear\",\n density_noise=\"uniform\",\n moment_matching=True,\n)\nsolver.fit(ev, end_time)"
69+
"print('Type of ev object', type(ev))\n# ev is a list of numpy arrays, one for each dimension\nprint('Number of events', len(ev[0]))\nprint('Shape of first event array', ev[0].shape)\n# Each dimension is stored as a numpy array of shape (n_events, 2).\nprint('First 10 events timestamps and marks', ev[0][:10])\n# Each event is stored as [timestamp, mark].\n# This is the expected data format for UNHaP.\nprint('First event timestamp', ev[0][0][0])\nprint('First event mark', ev[0][0][1])\nprint('Second event timestamp', ev[0][1][0])\nprint('Second event mark', ev[0][1][1])"
7070
]
7171
},
7272
{
@@ -77,7 +77,7 @@
7777
},
7878
"outputs": [],
7979
"source": [
80-
"print(\"Estimated baseline is: \", solver.param_baseline[-10:].mean().item())\nprint(\"Estimated alpha is: \", solver.param_alpha[-10:].mean().item())\nprint(\"Estimated kernel mean is: \", (solver.param_kernel[0][-10:].mean().item()))\nprint(\"Estimated kernel sd is: \", solver.param_kernel[1][-10:].mean().item())\nprint(\"Estimated noise baseline is: \", solver.param_baseline_noise[-10:].mean().item())\n# error on params\nerror_baseline = (solver.param_baseline[-10:].mean().item() - baseline.item()) ** 2\nerror_baseline_noise = (\n solver.param_baseline_noise[-10:].mean().item() - baseline_noise.item()\n) ** 2\nerror_alpha = (solver.param_alpha[-10:].mean().item() - alpha.item()) ** 2\nerror_mu = (solver.param_kernel[0][-10:].mean().item() - 0.5) ** 2\nerror_sigma = (solver.param_kernel[1][-10:].mean().item() - 0.1) ** 2\nsum_error = error_baseline + error_baseline_noise + error_alpha + error_mu + error_sigma\nerror_params = np.sqrt(sum_error)\n\nprint(\"L2 square errors of the vector of parameters is:\", error_params)"
80+
"solver = UNHaP(\n n_dim=1,\n kernel=\"truncated_gaussian\",\n kernel_length=1.0,\n init='moment_matching_mean',\n delta=delta,\n optim=\"RMSprop\",\n params_optim={\"lr\": 1e-3},\n max_iter=max_iter,\n batch_rho=batch_rho,\n density_hawkes=\"linear\",\n density_noise=\"uniform\",\n)\nsolver.fit(ev, end_time)"
8181
]
8282
},
8383
{
@@ -88,7 +88,18 @@
8888
},
8989
"outputs": [],
9090
"source": [
91-
"fig, axs = plot(solver, plotfig=False, bl_noise=True, title=\"UNHaP fit\", savefig=None)\nplt.show(block=True)"
91+
"print(\"Estimated baseline is: \", solver.baseline_.item())\nprint(\"Estimated alpha is: \", solver.alpha_.item())\nprint(\"Estimated kernel mean is: \", solver.kernel_[0].item())\nprint(\"Estimated kernel sd is: \", solver.kernel_[1].item())\nprint(\"Estimated noise baseline is: \", solver.baseline_noise_.item())\n# error on params\nerror_bl = (solver.baseline_.item() - baseline.item()) ** 2\nerror_bl_noise = (\n solver.baseline_noise_.item() - baseline_noise.item()\n) ** 2\nerror_alpha = (solver.alpha_.item() - alpha.item()) ** 2\nerror_mu = (solver.kernel_[0].item() - mu.item()) ** 2\nerror_sigma = (solver.kernel_[1].item() - sigma.item()) ** 2\nsum_error = error_bl + error_bl_noise + error_alpha + error_mu + error_sigma\nerror_params = np.sqrt(sum_error)\n\nprint(\"L2 square error of the vector of parameters is:\", error_params)"
92+
]
93+
},
94+
{
95+
"cell_type": "code",
96+
"execution_count": null,
97+
"metadata": {
98+
"collapsed": false
99+
},
100+
"outputs": [],
101+
"source": [
102+
"fig, axs = plot(\n solver,\n plotfig=False,\n bl_noise=True,\n title=\"UNHaP fit\",\n savefig=None\n)\nplt.show(block=True)"
92103
]
93104
}
94105
],

_downloads/249f41bcacce2f11424e25d9f61ef920/plot_multivariate_fadin.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
events = simu_hawkes_cluster(T, baseline, alpha, kernel)
5050

5151
###############################################################################
52-
# Here, we apply FaDIn.
53-
52+
# Here, we initiate FaDIn and fit it to the simulated data.
53+
print("Fitting FaDIn solver...")
5454
solver = FaDIn(
5555
n_dim=n_dim,
5656
kernel="truncated_exponential",
@@ -60,25 +60,20 @@
6060
max_iter=10000
6161
)
6262
solver.fit(events, T)
63+
print("FaDIn solver fitted.")
64+
# We can now access the estimated parameters of the model.
6365

64-
# We average on the 10 last values of the optimization.
65-
66-
estimated_baseline = solver.param_baseline[-10:].mean(0)
67-
estimated_alpha = solver.param_alpha[-10:].mean(0)
68-
param_kernel = [solver.param_kernel[0][-10:].mean(0)]
69-
70-
print('Estimated baseline is:', estimated_baseline)
71-
print('Estimated alpha is:', estimated_alpha)
66+
print('Estimated baseline is:', solver.baseline_)
67+
print('Estimated alpha is:', solver.alpha_)
7268
print('Estimated parameters of the truncated Exponential kernel is:',
73-
param_kernel[0])
69+
solver.kernel_)
7470

7571
###############################################################################
7672
# Here, we plot the values of the estimated kernels with FaDIn.
7773

7874
kernel = DiscreteKernelFiniteSupport(dt, n_dim, kernel='truncated_exponential',
7975
kernel_length=kernel_length)
80-
kernel_values = kernel.kernel_eval(param_kernel,
81-
discretization)
76+
kernel_values = kernel.kernel_eval(solver.kernel_, discretization)
8277

8378
plt.subplots(figsize=(12, 8))
8479
for i in range(n_dim):

_downloads/25f9018d86375d7894bb79acc78a8375/plot_univariate_fadin.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
# Here, we set the parameters of a Hawkes process with an Exponential(1) distribution.
3838

3939
baseline = np.array([.4])
40-
alpha = np.array([[0.8]])
41-
beta = 2.
40+
alpha = np.array([[0.9]])
41+
beta = 0.8
4242
###############################################################################
4343
# Here, we simulate the data.
4444

@@ -48,6 +48,17 @@
4848
events = simu_hawkes_cluster(T, baseline, alpha, kernel,
4949
params_kernel={'scale': 1 / beta})
5050

51+
###############################################################################
52+
# Let's take a closer look at the events
53+
print('Type of events object', type(events))
54+
# events is a list of numpy arrays, one for each dimension
55+
print('Number of events', len(events[0]))
56+
print('First 10 events timestamps', events[0][:10])
57+
# For each event, its occurence time (timestamp) is stored in the numpy array.
58+
59+
# `events`` is a list. Its elements are numpy arrays containing the timestamps
60+
# of the events. This is the expected data format for FaDIn.
61+
5162
###############################################################################
5263
# Here, we apply FaDIn.
5364

@@ -60,24 +71,20 @@
6071
)
6172
solver.fit(events, T)
6273

63-
# We average on the 10 last values of the optimization.
64-
65-
estimated_baseline = solver.param_baseline[-10:].mean().item()
66-
estimated_alpha = solver.param_alpha[-10:].mean().item()
67-
param_kernel = [solver.param_kernel[0][-10:].mean().item()]
74+
###############################################################################
75+
# Here, we print the estimated parameters of the Hawkes process.
6876

69-
print('Estimated baseline is:', estimated_baseline)
70-
print('Estimated alpha is:', estimated_alpha)
71-
print('Estimated beta parameter of the exponential kernel is:', param_kernel[0])
77+
print('Estimated baseline is:', solver.baseline_.item())
78+
print('Estimated alpha is:', solver.alpha_.item())
79+
print('Estimated beta parameter of the exponential kernel is:', solver.kernel_)
7280

7381

7482
###############################################################################
7583
# Here, we plot the values of the estimated kernel with FaDIn.
7684

7785
kernel = DiscreteKernelFiniteSupport(dt, n_dim, kernel='truncated_exponential',
7886
kernel_length=kernel_length)
79-
kernel_values = kernel.kernel_eval([torch.Tensor([param_kernel])],
80-
discretization)
87+
kernel_values = kernel.kernel_eval(solver.kernel_, discretization)
8188

8289
plt.plot(discretization[1:], kernel_values.squeeze()[1:]/kernel_length,
8390
label='FaDIn\' estimated kernel')
Binary file not shown.

_downloads/3cbf9c2a3c579b74d19d62597ee65f22/plot_unhap.py

Lines changed: 45 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@
2020
import numpy as np
2121
import matplotlib.pyplot as plt
2222

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
2524
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
2825
from fadin.utils.vis import plot
2926

3027

31-
# %% Fixing the parameter of the simulation setting
28+
# %% Fix the simulation and solver parameters
3229

3330
baseline = np.array([0.3])
3431
baseline_noise = np.array([0.05])
@@ -37,120 +34,74 @@
3734
sigma = np.array([[0.1]])
3835

3936
delta = 0.01
40-
end_time = 10000
37+
end_time = 1000
4138
seed = 0
42-
max_iter = 20000
39+
max_iter = 2000
4340
batch_rho = 200
4441

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
11546
)
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
11763

11864
solver = UNHaP(
11965
n_dim=1,
12066
kernel="truncated_gaussian",
12167
kernel_length=1.0,
68+
init='moment_matching_mean',
12269
delta=delta,
12370
optim="RMSprop",
12471
params_optim={"lr": 1e-3},
12572
max_iter=max_iter,
12673
batch_rho=batch_rho,
12774
density_hawkes="linear",
12875
density_noise="uniform",
129-
moment_matching=True,
13076
)
13177
solver.fit(ev, end_time)
13278

13379
# %% Print estimated parameters
13480

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())
14086
# 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()
14490
) ** 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
14995
error_params = np.sqrt(sum_error)
15096

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)
15298

15399
# %% 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+
)
155107
plt.show(block=True)
156-
# %%

0 commit comments

Comments
 (0)