Есть ли термин для использования того факта, что данные состоят из нескольких часто повторяющихся значений для ускорения вычислений?
В качестве примера при попытке вычислить выборочную энтропию для длинной дискретной последовательности (длина = 64,000 .000.000, Distinct elements = 11, Length of substring = 3) Мне показалось, что время выполнения слишком велико (более 10 минут). Я понял, что смогу использовать относительно небольшое количество отдельных элементов для ускорения вычислений, но не смог найти никакой литературы, относящейся к этому (подозреваю, потому что не знаю, что делать в Google).
Алгоритм Sample Entropy включает подсчет пар подстрок, которые находятся в пределах определенного допуска. Это был вычислительно дорогостоящий аспект алгоритма O (n ^ 2) . Взяв только отдельные подстроки (которых было не более 1331), я смог найти пары разных подстрок в пределах допуска, затем я использовал счетчики каждой отдельной подстроки, чтобы найти общее количество пар (неотличимых ) подстроки, которые находятся в пределах определенного допуска. Этот метод существенно ускорил мои вычисления.
Есть ли у алгоритмов, использующих свойство относительно небольшого числа часто повторяющихся элементов, особую c терминологию.
def sampen(L, m, r):
N = len(L)
B = 0.0
A = 0.0
# Split time series and save all templates of length m
xmi = np.array([L[i : i + m] for i in range(N - m)])
xmj = np.array([L[i : i + m] for i in range(N - m + 1)])
# Save all matches minus the self-match, compute B
B = np.sum([np.sum(np.abs(xmii - xmj).max(axis=1) <= r) - 1 for xmii in xmi])
# Similar for computing A
m += 1
xm = np.array([L[i : i + m] for i in range(N - m + 1)])
A = np.sum([np.sum(np.abs(xmi - xm).max(axis=1) <= r) - 1 for xmi in xm])
# Return SampEn
return -np.log(A / B)
def sampen2(L, m, r):
N = L.shape[0]
# Split time series and save all templates of length m
xmi = np.array([L[i : i + m] for i in range(N - m)])
xmj = np.array([L[i : i + m] for i in range(N - m + 1)])
# Find the unique subsequences and their counts
uni_xmi, uni_xmi_counts = np.unique(xmi, axis=0, return_counts = True)
uni_xmj, uni_xmj_counts = np.unique(xmj, axis=0, return_counts = True)
# Save all matches minus the self-match, compute B
B = np.sum(np.array([np.sum((np.abs(unii - uni_xmi).max(axis=1) <= r)*uni_xmj_counts)-1 for unii in uni_xmi])*uni_xmi_counts)
# Similar for computing A
m +=1
xm = np.array([L[i: i + m] for i in range(N - m + 1)])
uni_xm, uni_xm_counts= np.unique(xm, axis=0, return_counts = True)
A = np.sum(np.array([np.sum((np.abs(unii - uni_xm).max(axis=1) <= r)*uni_xm_counts)-1 for unii in uni_xm])*uni_xm_counts)
return -np.log(A / B)