def DTW_features(pcg, transitions, interval='RR', constraint='sakoe_chiba', k=0.1, norm="resample", pre=None, downsample_rate=2, suf=None, sigma=None):
k = float(k)
if sigma is not None:
sigma = float(sigma)
pcg = dtw_preprocess(pcg, pre=pre)
resize = ALENGTH[interval] if norm == 'resample' else None
intervals = get_intervals(pcg, transitions, interval=interval, resize=resize)
intervals = [resample(i, len(i) // downsample_rate) for i in intervals]
if norm not in ['path', 'resample']:
raise ValueError("Invalid normalization {0}".format(norm))
path_norm = norm == 'path'
dist_matrix = dtw_distances(intervals, n_jobs=-1, constraint=constraint, k=k, path_norm=path_norm, normalize=True)
dist_matrix = finite_matrix(dist_matrix)
medoid_index = np.argmin(np.sum(dist_matrix, axis=0))
# Remove the infinite distances
if sigma:
dist_matrix = -affinity(dist_matrix, sigma)
medoid_distances = dist_matrix[:, medoid_index]
medoid_distances = medoid_distances[np.isfinite(medoid_distances)]
m_MDTW, s_MDTW = _mean_std(medoid_distances)
Q1_MDTW, Q2_MDTW, Q3_MDTW = np.percentile(medoid_distances, [25, 50, 75])
contiguous_distances = np.array([dist_matrix[i, i + 1] for i in np.arange(len(dist_matrix) - 1)])
contiguous_distances = contiguous_distances[np.isfinite(contiguous_distances)]
Q1_CDTW, Q2_CDTW, Q3_CDTW = np.percentile(contiguous_distances, [25, 50, 75])
features = np.array([m_MDTW, s_MDTW, Q1_MDTW, Q2_MDTW, Q3_MDTW, Q1_CDTW, Q2_CDTW, Q3_CDTW])
return features
评论列表
文章目录