Позвольте мне написать несколько предложений, которые вы могли бы найти полезными.Предположим, мы хотим сэмплировать один бит с заданной энтропией.Таким образом, это либо 0, либо 1, и требуемая энтропия равна e
.
H (10 | p) = -p log 2 (p) - (1 - p) log 2 (1 - p), где p
- вероятность получить 1. Простой тест - в случае p = 1/2 можно получить энтропию 1 - максимальную энтропию.Таким образом, вы выбираете e
равным некоторому значению ниже 1, решаете уравнение
-p log 2 (p) - (1 - p) log 2 (1- p) = e
и получить обратно p
, и тогда вы можете начать выборку, используя распределение Бернулли .Простая демонстрация здесь .А в C ++ можно использовать стандартную библиотечную процедуру .
Хорошо, предположим, что вы хотите сэмплировать один байт с заданной энтропией.Он имеет 256 значений и энтропию
H (байт | \ vec {p}) = -Sum (1 ... 256) p i log 2 (p i ).
Опять же, если все комбинации равновероятны (p i = 1/256), вы получите -256/256 log 2 (1/256) = 8, что является максимальной энтропией.Если вы теперь исправите свою энтропию (скажем, я хочу, чтобы она равнялась 7), то для p i было бы бесконечное число решений, единой уникальной реализации данной энтропии не было бы.
Вы могли бы немного упростить задачу - давайте снова рассмотрим случай с одним параметром, где вероятность найти 1
равна p
, а вероятность найти 0
равна (1-p).Таким образом, из 256 результатов мы получили 9 из них - 00000000, 00000001, 00000011, 00000111, 00001111, 00011111, 00111111, 01111111, 11111111. Для каждого из этих случаев мы могли бы написать вероятность, вычислить энтропию, присвоить ее как угодно ирешите обратно, чтобы найти p
.
Выборка будет относительно простой - первым шагом будет выборка из 9 комбинаций с помощью дискретного распределения , а вторым шагом будут биты тасования внутри байтаиспользуя Fisher-Yates shuffle .
Тот же подход можно использовать, скажем, для 32-битных или 64-битных - у вас есть 33 или 65 случаев, построить энтропию, назначить на что угодно, найти p
, сэмплируйте один из них и затем перетасуйте биты в выборочном значении.
Прямо сейчас нет кода, но я мог бы написать некоторый код позже, если есть интерес ...
ОБНОВЛЕНИЕ
Имейте в виду еще одно своеобразное свойство фиксирующей энтропии.Даже для простого случая одиночного бита, если вы попытаетесь решить
-p log 2 (p) - (1 - p) log 2 (1 -p) = e
для данного e
, вы получите два ответа, и легко понять, почему - уравнение симметрично относительно p
и 1-p
(или замену 0 на 1 и1 с 0).Другими словами, для энтропии не имеет значения, если вы передаете информацию, используя в основном нули или в основном единицы.Это не относится к таким вещам, как естественный текст.