Matlab:帮助离散化时间序列的熵估计
Matlab : Help in entropy estimation of a disretized time series
这个问题是上一个问题
的延续
我想计算一个随机变量的熵,它是一个连续随机变量的离散化版本 (0/1) x
。随机变量表示称为 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 )
看起来你的概率之一是零。在这种情况下,您将尝试计算 0*log(0) = 0*-Inf = NaN
。在这种情况下,熵应该为零,因此您可以明确地检查这种情况。
一些旁注:您似乎在声明 H=log(2)
,但您的 post 表示熵为 log_2(2)。 p_0
始终是 1 - p_1
,因此您不必再次计算所有内容。动态增长数组效率低下,因为 matlab 必须在每一步重新复制全部内容。您可以通过预先分配它们来加快速度(只有当您要 运行 许多时间步时才值得)。
这个问题是上一个问题
我想计算一个随机变量的熵,它是一个连续随机变量的离散化版本 (0/1) x
。随机变量表示称为 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 )
看起来你的概率之一是零。在这种情况下,您将尝试计算 0*log(0) = 0*-Inf = NaN
。在这种情况下,熵应该为零,因此您可以明确地检查这种情况。
一些旁注:您似乎在声明 H=log(2)
,但您的 post 表示熵为 log_2(2)。 p_0
始终是 1 - p_1
,因此您不必再次计算所有内容。动态增长数组效率低下,因为 matlab 必须在每一步重新复制全部内容。您可以通过预先分配它们来加快速度(只有当您要 运行 许多时间步时才值得)。