Matlab: путаница в отношении единицы энтропии для использования в примере

Прогнозирование карты палатки

Рисунок 1. График гипотез. Ось y: средняя энтропия. ось x: биты.


Этот вопрос является продолжением предыдущего вопроса Matlab: график энтропии против длина оцифрованного кода

Я хочу вычислить энтропию случайной величины, которая является дискретной версией (0/1) непрерывной случайной величины x. Случайная величина обозначает состояние нелинейной динамической системы, называемой картой палатки. Итерации карты палатки дают временной ряд длиной N.

Код должен выйти, как только энтропия дискретизированного временного ряда станет равной энтропии динамической системы. Теоретически известно, что энтропия системы H is log_e(2) or ln(2) = 0.69 ок. Цель кода - найти количество итераций j, необходимых для получения той же энтропии, что и энтропия системы H.

Проблема 1: Моя проблема в том, что когда я вычисляю энтропию двоичного временного ряда, который является информационным сообщением, то должен ли я делать это в той же базе, что и H? ИЛИ Должен ли я преобразовать значение H в биты, потому что информационное сообщение находится в 0/1? Оба дают разные результаты, т. Е. Разные значения j.

Проблема 2: Может случиться так, что вероятность нулей или единиц может стать нулевой, так что соответствующая ей энтропия может стать бесконечностью. Чтобы этого не произошло, я подумал поставить проверку с помощью if-else. Но петля

if entropy(:,j)==NaN
     entropy(:,j)=0;
 end

похоже не работает. Буду рад идеям и помочь решить эту проблему. Спасибо

ОБНОВЛЕНИЕ: я реализовал предложения и ответы по исправлению кода. Однако раньше моя логика решения была неправильной. В исправленном коде я хочу вычислить энтропию для длины временного ряда, имеющего биты 2,8,16,32. Для каждой длины кода рассчитывается энтропия. Вычисление энтропии для каждой длины кода повторяется N раз, начиная с каждого различного начального состояния динамической системы. Эта оценка применяется для проверки того, при какой длине кода энтропия становится равной 1. Характер графика зависимости энтропии от битов должен возрастать от нуля и постепенно приближаться к 1, после чего он насыщается - остается постоянным для всех оставшихся битов. Я не могу получить эту кривую (рисунок 1). Буду признателен за помощь в исправлении моей ошибки.

clear all

 H = 1  %in bits
 Bits = [2,8,16,32,64];
threshold = 0.5;
N=100;  %Number of runs of the experiment


for r = 1:length(Bits)


t = Bits(r)

for Runs = 1:N
    x(1)            = rand;

    for j = 2:t


        % Iterating over the Tent Map


        if x(j - 1) < 0.5
            x(j) = 2 * x(j - 1);
        else
            x(j) = 2 * (1 - x(j - 1));
        end % if
    end
    %Binarizing the output of the Tent Map
    s  = (x >=threshold);
    p1 = sum(s == 1 ) / length(s);  %calculating probaility of number of 1's
    p0 = 1 - p1;  % calculating probability of number of 0'1

    entropy(t) = -p1 * log2(p1) - (1 - p1) * log2(1 - p1); %calculating entropy in bits

    if isnan(entropy(t))
        entropy(t) = 0;
    end



    %disp(abs(lambda-H))



end


  Entropy_Run(Runs) =  entropy(t)
end
Entropy_Bits(r) = mean(Entropy_Run)
plot(Bits,Entropy_Bits)

person SKM    schedule 30.05.2016    source источник
comment
Порог не указан в скрипте !? А что случилось с ~(abs(lambda-H)<tol)) и tol?   -  person noumenal    schedule 01.06.2016
comment
Порог = 0,5; извините, это почему-то не появилось в коде   -  person SKM    schedule 01.06.2016
comment
Привет, присоединяйся к чату ниже!   -  person noumenal    schedule 01.06.2016
comment
Чат: chat.stackoverflow.com/rooms/113465/   -  person noumenal    schedule 01.06.2016
comment
В соответствии с моими комментариями к вашим существенным изменениям по вашему собственному вопросу здесь, изменения, удаляющие фрагменты кода, могут рассматриваться как деструктивные, если только они не оправдано примечанием к редактированию или комментарием. Наверное, лучше их вообще не делать.   -  person halfer    schedule 20.06.2016


Ответы (2)


Сначала ты просто

function [mean_entropy, bits] = compute_entropy(bits, blocks, threshold, replicate)

    if replicate
        disp('Replication is ON');
    else
        disp('Replication is OFF');
    end

    %%
    % Populate random vector
    if replicate
        seed = 849;
        rng(seed);
    else
        rng('default');
    end

    rs = rand(blocks);


    %%
    % Get random
    trial_entropy = zeros(length(bits));

    for r = 1:length(rs)

        bit_entropy = zeros(length(bits), 1); % H

        % Traverse bit trials
        for b = 1:(length(bits)) % N

            tent_map = zeros(b, 1); %Preallocate for memory management

            %Initialize
            tent_map(1) = rs(r);

            for j = 2:b % j is the iterator, b is the current bit

                if tent_map(j - 1) < threshold
                    tent_map(j) = 2 * tent_map(j - 1);
                else
                    tent_map(j) = 2 * (1 - tent_map(j - 1));
                end % if
            end

            %Binarize the output of the Tent Map
            s  = find(tent_map >= threshold);
            p1 = sum(s == 1) / length(s);  %calculate probaility of number of 1's
            %p0 = 1 - p1;  % calculate probability of number of 0'1

            bit_entropy(b) = -p1 * log2(p1) - (1 - p1) * log2(1 - p1); %calculate entropy in bits

            if isnan(bit_entropy(b))
                bit_entropy(b) = 0;
            end

            %disp(abs(lambda-h))

        end

        trial_entropy(:, r) = bit_entropy;

        disp('Trial Statistics')
        data = get_summary(bit_entropy);
        disp('Mean')
        disp(data.mean);
        disp('SD')
        disp(data.sd);

    end

    % TO DO Compute the mean for each BIT index in trial_entropy
    mean_entropy = 0;

    disp('Overall Statistics')
    data = get_summary(trial_entropy);
    disp('Mean')
    disp(data.mean);
    disp('SD')
    disp(data.sd);

    %This is the wrong mean...
    mean_entropy = data.mean;

    function summary = get_summary(entropy)
        summary = struct('mean', mean(entropy), 'sd', std(entropy));
    end
end

и тогда тебе просто нужно

% Entropy Script
clear all

%% Settings
replicate = false; % = false % Use true for debugging only.
%H = 1;  %in bits
Bits = 2.^(1:6);
Threshold = 0.5;
%Tolerance = 0.001;
Blocks = 100;  %Number of runs of the experiment

%% Run
[mean_entropy, bits] = compute_entropy(Bits, Blocks, Threshold, replicate);

%What we want
%plot(bits, mean_entropy);

%What we have
plot(1:length(mean_entropy), mean_entropy);
person noumenal    schedule 30.05.2016
comment
Спасибо за ваш ответ. Я использовал условие (abs (lambda-H) ›= tol) на основе ответа, данного в моем предыдущем вопросе. Спасибо за ваши предложения. Какой сайт stackexchange лучше подходит для решения проблемы 1, чтобы на нее можно было ответить? - person SKM; 30.05.2016
comment
Physicsforums.com/threads/ сообщает что можно конвертировать между базами Итак, я применил формулу и преобразовал энтропию в натс в ноты бит, используя x = log (2) (единицы в натс); H = log (x) * 1,443 (единица измерения в битах); % log2 (e) = 1.443 и вычисленная энтропия с использованием базы 2, тогда код не сходится !! Это потому, что теперь H = -0,5289 бит, отрицательная энтропия вызывает проблему. Я сделал ошибку в формуле? - person SKM; 30.05.2016
comment
Для меня это продвинутый путь. Я думаю, что вы находитесь в правильном месте, чтобы задавать вопросы о коде. Думаю, вы могли бы привлечь больше внимания, если бы улучшили заголовки своих вопросов. Вы не задаете вопрос в заголовке. И вы не говорите нам, зачем вам нужно вычислять энтропию. Если это связано с машинным обучением или статистикой, перекрестная проверка может быть лучшим стеком. Если это связано с теорией информации, попробуйте сначала понять формулу, запросив стек Math. Постройте столько, сколько сможете, лямбда-H против j. - person noumenal; 31.05.2016
comment
Спасибо за вашу постоянную помощь. Я был бы признателен, если бы вы нашли время, чтобы просмотреть обновленный код. Я хочу увидеть, какова энтропия для разной длины двоичного временного ряда. Затем выберите длину, для которой энтропия = 1. Но запуск кода каждый раз дает разный результат выбора длины. Это происходит из-за случайного характера динамической системы; начальное условие не дает должного результата, как я хочу для энтропии. Поэтому я выбрал другую логику, объясненную в следующем комментарии. - person SKM; 31.05.2016
comment
В обновленном обновлении энтропия рассчитывается для определенной длины временного ряда. Я провожу эксперимент N раз для определенной длины кода для разных начальных условий динамической системы. Итак, энтропия для каждого временного ряда будет средней энтропией. Не уверен, передает ли это идею. Но у меня проблема с последним массивом Entropy_Bits: он хранит только значение энтропии для последней длины кода. Буду признателен, если вы любезно поможете. - person SKM; 31.05.2016
comment
Вы должны понять, как установить начальное число случайной функции для отладки. Если вы можете установить начальное число, случайная функция вернет тот же результат, и вы сможете изучить параметры, которые не сохраняются постоянными. - person noumenal; 01.06.2016
comment
Вам нужно накапливать Entropy_Bits в массиве? - person noumenal; 01.06.2016
comment
Да, мне нужен массив, чтобы построить график битов в зависимости от его энтропии - person SKM; 01.06.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person noumenal; 01.06.2016

Для задачи 1 H и entropy могут быть либо в натсах, либо в битах, если они оба вычисляются с использованием одних и тех же единиц. Другими словами, вы должны использовать либо log для обоих, либо log2 для обоих. В примере кода, который вы предоставили, H и entropy правильно вычисляются с использованием согласованных единиц nats. Если вы предпочитаете работать с битами, преобразование H должно дать вам H = log(2)/log(2) = 1 (или с использованием коэффициента преобразования 1/log(2) ~ 1.443, H ~ 0.69 * 1.443 ~ 1).

Для проблемы 2, как уже указывал @noumenal, вы можете проверить NaN, используя _11 _ . В качестве альтернативы вы можете проверить, находится ли p1 в пределах (0,1) (исключая 0 и 1) с помощью:

if (p1 > 0 && p1 < 1)
    entropy(:,j) = -p1 * log(p1) - (1 - p1) * log(1 - p1); %calculating entropy  in natural base e
else
    entropy(:, j) = 0;
end
person SleuthEye    schedule 31.05.2016