Однажды мне нужно было написать функцию, которая вычисляет энтропию блоков для данной серии символов для данного размера блока, и был удивлен, насколько коротким был результат. Таким образом, я призываю вас кодировать такую функцию. Я не скажу вам, что я сделал сейчас (и на каком языке), но я сделаю это через неделю или около того, если никто не придумал те же или лучшие идеи в первую очередь.
Определение блока энтропии:
Для данной последовательности символов A = A_1,…, A_n и размера блока m:
- Блок размером m является сегментом из m последовательных элементов последовательности символов, то есть A_i,…, A_ (i + m − 1) для любого подходящего i.
- Если x является символьной последовательностью размера m, N (x) обозначает количество блоков A, которые идентичны x.
- p (x) - вероятность того, что блок из A идентичен последовательности символов x размера m, т. е. p (x) = N (x) / (n − m + 1)
- Наконец, энтропия блока для размера блока m из A является средним значением -log (p (x)) по всем блокам x размера m в A или (что эквивалентно) сумме -p (x) · log (p) (x)) по каждому x размера m, встречающемуся в A. (Вы можете выбрать любой разумный логарифм, который хотите.)
Ограничения и уточнения:
- Ваша функция должна принимать последовательность символов A, а также размер блока m в качестве аргумента.
- Вы можете предположить, что символы представлены как целые числа, начинающиеся с нуля, или в другом удобном формате.
- Ваша программа должна быть способна принимать любые разумные аргументы в теории и в действительности должна быть способна рассчитать пример (см. Ниже) на стандартном компьютере.
- Разрешены встроенные функции и библиотеки, если они не выполняют большие части процедуры за один вызов, то есть извлекают все блоки размером m из A, подсчитывают количество вхождений данного блока x или вычисляют энтропии. из последовательности значений р - вы должны сделать эти вещи самостоятельно.
Тестовое задание:
[2, 3, 4, 1, 2, 3, 0, 0, 3, 2, 3, 0, 2, 2, 4, 4, 4, 1, 1, 1, 0, 4, 1,
2, 2, 4, 0, 1, 2, 3, 0, 2, 3, 2, 3, 2, 0, 1, 3, 4, 4, 0, 2, 1, 4, 3,
0, 2, 4, 1, 0, 4, 0, 0, 2, 2, 0, 2, 3, 0, 0, 4, 4, 2, 3, 1, 3, 1, 1,
3, 1, 3, 1, 0, 0, 2, 2, 4, 0, 3, 2, 2, 3, 0, 3, 3, 0, 0, 4, 4, 1, 0,
2, 3, 0, 0, 1, 4, 4, 3]
Первые блок-энтропии этой последовательности (для натурального логарифма):
- м = 1: 1,599
- м = 2: 3,065
- м = 3: 4,067
- м = 4: 4,412
- m = 5: 4,535
- м = 6: 4,554
entropy(probabilities(blocks(A,m))).