【发布时间】:2016-05-30 17:50:36
【问题描述】:
图 1. 假设图。 y 轴:平均熵。 x轴:位。
这个问题是上一个问题的延续 Matlab : Plot of entropy vs digitized code length
我想计算一个随机变量的熵,该随机变量是连续随机变量x 的离散化版本 (0/1)。随机变量表示称为Tent Map 的非线性动力系统的状态。帐篷地图的迭代产生长度为N 的时间序列。
一旦离散时间序列的熵等于动态系统的熵,代码就应该退出。理论上已知系统的熵,H is log_e(2) or ln(2) = 0.69 约。代码的目标是找到迭代次数,j 需要产生与系统熵相同的熵,H。
问题 1:当我计算作为信息消息的二进制时间序列的熵时,我应该在与 H 相同的基础上进行计算吗?或者我应该将 H 的值转换为位,因为信息消息在 0/1 中吗?两者都给出不同的结果,即 j 的不同值。
问题 2:0 或 1 的概率可能会变为零,因此与之对应的熵可能会变为无穷大。为了防止这种情况,我想到了使用 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)
【问题讨论】:
-
阈值是脚本中定义的注释!?
~(abs(lambda-H)<tol))和tol发生了什么? -
阈值 = 0.5;抱歉,它没有出现在代码中
-
嘿,来加入下面的聊天吧!
-
根据我对您的 substantial edits on your own question here 的评论,删除大量代码的编辑可能被视为具有破坏性,除非它们被编辑评论或评论证明是合理的。最好不要制作它们。
标签: matlab signal-processing entropy