Matlab:帮助进行不同时间序列的熵估计

时间:2016-05-27 03:11:45

标签: matlab entropy

此问题继续提到前一个问Matlab : Plot of entropy vs digitized code length

我想计算随机变量的熵,该随机变量是连续随机变量x的离散化版本(0/1)。随机变量表示称为Tent Map的非线性动力系统的状态。 Tent Map的迭代产生长度为N的时间序列。

一旦离散时间序列的熵变得等于动力系统的熵,代码就应该退出。理论上已知系统的熵是log_2(2)。代码退出但熵数组的前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 )

1 个答案:

答案 0 :(得分:1)

看起来你的一个概率为零。在这种情况下,您将尝试计算0*log(0) = 0*-Inf = NaN。在这种情况下,熵应该为零,因此您可以明确地检查这个条件。

夫妻旁注:看起来你正在声明H=log(2),但你的帖子说熵是log_2(2)。 p_0始终为1 - p_1,因此您无需重新计算所有内容。动态增长数组是低效的,因为matlab必须在每一步重新复制整个内容。您可以通过预先分配它们来加快速度(只有在您要运行很多时间步时才值得。)