-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheegfeatures.py
141 lines (109 loc) · 3.54 KB
/
eegfeatures.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# This script is to calculate commonly used features
import numpy as np
from scipy.signal import lfilter
from scipy.signal import welch
from spectrum import arburg
def arithmetic_mean(X):
return np.mean(X)
def autoregressive_model(X, order=4):
return arburg(X, order)[0][1:]
def bandpower(X, fs, band):
f, Pxx = welch(X, fs=fs)
idx = np.logical_and(f >= band[0], f <= band[1])
return np.trapz(Pxx[idx], f[idx])
def bandpower_delta(X, fs):
return bandpower(X, fs, [1, 4])
def bandpower_theta(X, fs):
return bandpower(X, fs, [4, 8])
def bandpower_alpha(X, fs):
return bandpower(X, fs, [8, 12])
def bandpower_beta(X, fs):
return bandpower(X, fs, [12, 30])
def bandpower_gamma(X, fs):
return bandpower(X, fs, [30, 64])
def first_difference(X):
return np.mean(np.abs(np.diff(X)))
def hjorth_activity(X):
return np.var(X)
def hjorth_mobility(X):
d1 = np.diff(X)
return np.std(d1) / np.std(X)
def hjorth_complexity(X):
d1 = np.diff(X)
d2 = np.diff(d1)
return (np.std(d2) / np.std(d1)) / hjorth_mobility(X)
def kurtosis(X):
return scipy.stats.kurtosis(X)
def log_energy_entropy(X):
return np.sum(np.log(X**2))
def log_root_sum_sequential_variation(X):
return np.log10(np.sqrt(np.sum(np.diff(X)**2)))
def maximum(X):
return np.max(X)
def mean_curve_length(X):
return np.mean(np.abs(np.diff(X)))
def mean_energy(X):
return np.mean(X**2)
def mean_teager_energy(X):
return np.mean(X[1:-1]**2 - X[2:] * X[:-2])
def median(X):
return np.median(X)
def minimum(X):
return np.min(X)
def normalized_first_difference(X):
return first_difference(X) / np.std(X)
def normalized_second_difference(X):
return np.mean(np.abs(np.diff(X, n=2))) / np.std(X)
def ratio_bandpower_alpha_beta(X, fs):
return bandpower_beta(X, fs) / bandpower_alpha(X, fs)
def renyi_entropy(X, alpha=2):
p = X**2 / np.sum(X**2)
return (1 / (1 - alpha)) * np.log2(np.sum(p**alpha))
def second_difference(X):
return np.mean(np.abs(np.diff(X, n=2)))
def shannon_entropy(X):
p = X**2 / np.sum(X**2)
return -np.sum(p * np.log2(p))
def skewness(X):
return scipy.stats.skew(X)
def standard_deviation(X):
return np.std(X)
def tsallis_entropy(X, alpha=2):
p = X**2 / np.sum(X**2)
return (1 / (alpha - 1)) * (1 - np.sum(p**alpha))
def variance(X):
return np.var(X)
def extract_features(X, feature_type, **kwargs):
features = {
'mcl': mean_curve_length,
'ha': hjorth_activity,
'hm': hjorth_mobility,
'hc': hjorth_complexity,
'1d': first_difference,
'n1d': normalized_first_difference,
'2d': second_difference,
'n2d': normalized_second_difference,
'me': mean_energy,
'mte': mean_teager_energy,
'lrssv': log_root_sum_sequential_variation,
'te': tsallis_entropy,
'sh': shannon_entropy,
'le': log_energy_entropy,
're': renyi_entropy,
'am': arithmetic_mean,
'sd': standard_deviation,
'var': variance,
'md': median,
'max': maximum,
'min': minimum,
'ar': autoregressive_model,
'kurt': kurtosis,
'skew': skewness,
'bpd': bandpower_delta,
'bpt': bandpower_theta,
'bpa': bandpower_alpha,
'bpb': bandpower_beta,
'bpg': bandpower_gamma,
'rba': ratio_bandpower_alpha_beta,
}
return features[feature_type](X, **kwargs)