2016-05-27 1 views
0

Этот вопрос находится в продолжении к предыдущему спросил Matlab : Plot of entropy vs digitized code lengthMatlab: Помощь в оценке энтропии disretized временных рядов

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

Код должен выйти, как только энтропия дискретизированных временных рядов станет равна энтропии динамической системы. Теоретически известно, что энтропия системы равна log_2 (2). Код выходит, но значения frst 3 энтропийного массива ошибочны - entropy(1) = 1, entropy(2) = NaN and entropy(3) = NaN. Я почесываю голову, почему это происходит и как я могу избавиться от нее. Пожалуйста, помогите в исправлении кода. Спасибо.

clear all 


H = log(2) 

threshold = 0.5; 
x(1) = rand; 
lambda(1) = 1; 
entropy(1,1) = 1; 
j=2; 
tol=0.01; 
while(~(abs(lambda-H)<tol)) 



    if x(j - 1) < 0.5   
     x(j) = 2 * x(j - 1);       
    else 
     x(j) = 2 * (1 - x(j - 1));      
    end 



s = (x>=threshold); 
p_1 = sum(s==1)/length(s); 
p_0 = sum(s==0)/length(s); 
entropy(:,j) = -p_1*log2(p_1)-(1-p_1)*log2(1-p_1); 
lambda = entropy(:,j); 
j = j+1; 
end 
plot(entropy) 
+0

Привет. Пожалуйста, не удаляйте, не изменяйте или не подвергайте вандализму свои вопросы после того, как ответ пришел. Я не вижу цели вашего последнего редактирования, который устранил столько вопросов, что было бы непонятно/не по теме, поэтому я вернули его. – halfer

ответ

1

Похоже, что одна из ваших вероятностей равна нулю. В этом случае вы попытаетесь вычислить 0*log(0) = 0*-Inf = NaN. В этом случае энтропия должна быть нулевой, поэтому вы можете просто проверить это условие явно.

Пара примечаний стороны: похоже, что вы объявляете H=log(2), но ваше сообщение говорит, что энтропия - log_2 (2). p_0 всегда 1 - p_1, так что вам не нужно снова подсчитывать все. Растут массивы динамически неэффективно, потому что Matlab должен повторно копировать все содержимое на каждом шаге. Вы можете ускорить процесс, предварительно распределив их (это стоит того, если вы собираетесь запускать много временных меток).

+0

Благодарим вас за ответ. Я объявляю H = log (2), так как это энтропия системы. Я вычисляю энтропию биарных временных рядов и выхожу из программы, когда энтропия временных рядов (деградированная по энтропийной переменной) = H. Является ли H = log (2) не равным логарифмической базе 2 (2)? Кроме того, существует ли способ иметь нулевые вероятности? Строка находится в 0 и 1, поэтому я задаюсь вопросом, почему вероятность приближается к нулю. – SKM

+1

После первой итерации в цикле 's' будет содержать либо один, либо один нуль, поэтому вероятность для другого значения будет равна нулю. Это не большая проблема, но вы можете просто использовать оператор if для проверки и установить энтропию на нуль, если это так. – user20160

Смежные вопросы