Как вычислить приблизительную энтропию битовой строки?
есть ли стандартный способ сделать это?
8 ответов
энтропия не является свойством строки, которую вы получили, но строк, которые вы могли бы получить вместо этого. Другими словами, он определяет процесс по какой строке был создан.
в простом случае, вы получите одну строку между N возможные строки, где каждая строка имеет одинаковую вероятность выбора, чем любая другая, т. е. 1 / N. В этой ситуации строка, как говорят, имеет энтропию N. Этот энтропия часто выражается в битах, что является логарифмической шкалой: энтропия"n bits " - энтропия, равная 2n.
например: мне нравится генерировать мои пароли в виде двух строчных букв, затем двух цифр, затем двух строчных букв и, наконец, двух цифр (например,va85mw24
). Буквы и цифры выбираются случайным образом, равномерно и независимо друг от друга. Этот процесс может произвести 26*26*10*10*26*26*10*10 = 4569760000 distinct пароли, и эти пароли имеют равные шансы быть отобранными. Энтропия такого пароля составляет 4569760000, что означает около 32,1 бит.
уравнение энтропии Шеннона является стандартным методом расчета. Вот простая реализация на Python, бесстыдно скопированная из откровение кодовая база, и таким образом GPL лицензируется:
def entropy(string):
"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
def entropy_ideal(length):
"Calculates the ideal Shannon entropy of a string with given length"
prob = 1.0 / length
return -1.0 * length * prob * math.log(prob) / math.log(2.0)
обратите внимание, что эта реализация предполагает, что входной битовый поток лучше всего представлен в виде байтов. Это может быть или не быть в случае вашего проблемного домена. То, что вы действительно хотите, - это ваш битовый поток, преобразованный в строку чисел. Просто как вы решение о том, что это за цифры, зависит от домена. Если ваши числа действительно являются единицей и нулями, преобразуйте битовый поток в массив единиц и нулей. Однако выбранный вами метод преобразования повлияет на результаты, которые вы получите.
Я считаю, что ответ Сложность Колмогорова строки. Мало того, что это не отвечает с куском псевдокода, сложность Колмогорова не вычислимая функция!
одна вещь, которую вы можете сделать на практике, это сжать битовую строку с лучшим доступным сжатие данных. Чем больше он сжимает, тем ниже энтропия.
нет единого ответа. Энтропия всегда относительно некоторой модели. Когда кто-то говорит о пароле с ограниченной энтропией, они имеют в виду "относительно способности интеллектуального злоумышленника предсказать", и это всегда верхняя граница.
сказав это, есть некоторые довольно универсальные модели, которые вы можете попробовать; они называются алгоритмами сжатия. Если gzip может хорошо сжимать ваши данные, вы нашли по крайней мере одну модель, которая может хорошо предсказать это. И gzip, например, в основном нечувствителен к простой замене. Он может обрабатывать "wkh" часто в тексте так же легко, как он может обрабатывать "the".
Извините, что так долго отвечал на этот вопрос.
взгляните на мою недавнюю статью:
"BiEntropy-приближенная энтропия конечной двоичной строки"
http://arxiv.org/abs/1305.0954
"мы разрабатываем, реализуем и тестируем простой алгоритм, который вычисляет приближенную энтропию конечной двоичной строки произвольной длины. Алгоритм использует средневзвешенное значение энтропий Шеннона строки и все, кроме последняя двоичная производная строки. Мы успешно тестируем алгоритм в областях теории простых чисел (где мы явно доказываем, что последовательность простых чисел не является периодической), человеческого зрения, криптографии, генерации случайных чисел и количественных финансов"
инструментарий оценки генератора случайных чисел NIST имеет способ вычисления " приближенной энтропии.- Вот краткое описание:--1-->
приблизительное описание теста энтропии: фокус этого теста частота каждого перекрывающегося M-битного шаблона. Цель тест заключается в сравнении частоты перекрытия блоков из двух последовательные / смежные длины (m и m+1) против ожидаемого результата для случайного последовательность.
и более подробное объяснение доступно из PDF на странице:
http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
вот реализация в Python (я также добавил ее на страницу Wiki):
import numpy as np
def ApEn(U, m, r):
def _maxdist(x_i, x_j):
return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
def _phi(m):
x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
return -(N - m + 1.0)**(-1) * sum(np.log(C))
N = len(U)
return _phi(m) - _phi(m + 1)
пример:
>>> U = np.array([85, 80, 89] * 17)
>>> ApEn(U, 2, 3)
-1.0996541105257052e-05
приведенный выше пример соответствует пример, приведенный в Википедии.
используя энтропию Больцмана слова с этой формулой:http://imgur.com/a/DpcIH
вот алгоритм O(n), который вычисляет его :
import math
from collections import Counter
def entropy(s):
l = float(len(s))
return -sum(map(lambda a: (a/l)*math.log2(a/l), Counter(s).values()))