|
a |
|
b/4-Models/autoECG-tensorflow-keras/ecg_simulation.py |
|
|
1 |
#!/usr/bin/env python |
|
|
2 |
# coding: utf-8 |
|
|
3 |
|
|
|
4 |
# In[5]: |
|
|
5 |
|
|
|
6 |
|
|
|
7 |
import neurokit2 as nk |
|
|
8 |
import numpy as np |
|
|
9 |
import pandas as pd |
|
|
10 |
import parameters as para |
|
|
11 |
|
|
|
12 |
|
|
|
13 |
# In[26]: |
|
|
14 |
|
|
|
15 |
|
|
|
16 |
def simulation(normal_N,abnormal_N, save_params = False): |
|
|
17 |
normal_data = [] |
|
|
18 |
normal_params = [] |
|
|
19 |
print('Creating normal dataset') |
|
|
20 |
for i in range(normal_N): |
|
|
21 |
ti = np.random.normal(para.mu_t_1, para.sigma_t_1) |
|
|
22 |
ai = np.random.normal(para.mu_a_1, para.sigma_a_1) |
|
|
23 |
bi = np.random.normal(para.mu_b_1, para.sigma_b_1) |
|
|
24 |
hr = np.random.normal(para.mu_hr_1, para.sigma_hr_1) |
|
|
25 |
noise = np.random.uniform(low=para.min_noise_1, high=para.max_noise_1) |
|
|
26 |
ecgs, _ = nk.ecg_simulate(duration=para.duration*2, sampling_rate=para.sampling_rate, noise=noise, Anoise=para.Anoise, heart_rate=hr, gamma=para.gamma, ti=ti, ai=ai, bi=bi) |
|
|
27 |
ecgs = np.array(ecgs) |
|
|
28 |
start_i = np.random.randint(len(ecgs[0])//4, len(ecgs[0])//2) |
|
|
29 |
normal_data.append(ecgs[:,start_i:start_i+para.sampling_rate*para.duration]) |
|
|
30 |
normal_params.append({'ti':ti, 'ai':ai, 'bi':bi, 'hr':hr, 'noise':noise, 'gamma': para.gamma}) |
|
|
31 |
|
|
|
32 |
abnormal_data = [] |
|
|
33 |
abnormal_params = [] |
|
|
34 |
print('Creating abnormal dataset') |
|
|
35 |
for i in range(abnormal_N): |
|
|
36 |
ti = np.random.normal(para.mu_t_2, para.sigma_t_2) |
|
|
37 |
ai = np.random.normal(para.mu_a_2, para.sigma_a_2) |
|
|
38 |
bi = np.random.normal(para.mu_b_2, para.sigma_b_2) |
|
|
39 |
hr = np.random.normal(para.mu_hr_2, para.sigma_hr_2) |
|
|
40 |
noise = np.random.uniform(low=para.min_noise_2, high=para.max_noise_2) |
|
|
41 |
ecgs, _ = nk.ecg_simulate(duration=para.duration*2, sampling_rate=para.sampling_rate, noise=noise, Anoise=para.Anoise, heart_rate=hr, gamma=para.gamma, ti=ti, ai=ai, bi=bi) |
|
|
42 |
ecgs = np.array(ecgs) |
|
|
43 |
start_i = np.random.randint(len(ecgs[0])//4, len(ecgs[0])//2) |
|
|
44 |
abnormal_data.append(ecgs[:,start_i:start_i+para.sampling_rate*para.duration]) |
|
|
45 |
abnormal_params.append({'ti':ti, 'ai':ai, 'bi':bi, 'hr':hr, 'noise':noise, 'gamma': para.gamma}) |
|
|
46 |
|
|
|
47 |
labels = np.array([0]*len(normal_data) + [1]*len(abnormal_data)) |
|
|
48 |
permutation = np.random.permutation(len(labels)) |
|
|
49 |
data = np.array(normal_data+abnormal_data) |
|
|
50 |
data_params = np.array(normal_params+abnormal_params) |
|
|
51 |
labels = labels[permutation] |
|
|
52 |
data = data[permutation] |
|
|
53 |
data_params = data_params[permutation] |
|
|
54 |
|
|
|
55 |
np.save('sim_ecg_data', data) # save ECG data |
|
|
56 |
np.save('sim_ecg_labels', labels) # save label |
|
|
57 |
if (save_params): |
|
|
58 |
np.save('sim_ecg_params',data_params) # save parameters for each ecg sample (12,2500) |
|
|
59 |
|